三項演算子
C/C++ をはじめとして、多くの言語では「三項演算子」がサポートされています。
//偶奇性の表示 void PrintParity(int n){ puts((n % 2 == 0) ? "even" : "odd"); } |
処理の内容が同じでパラメータだけが異なるような処理の場合、三項演算子を上手く使うとコードが簡潔になります。
//偶奇性の表示 void PrintParity(int n){ if (n % 2 == 0) puts("even"); else puts("odd"); } |
しかし、「条件 (第 1項)」や「値 (第 2, 3項)」が長い場合は、コードが横にだらだらと伸びてしまい美しくありません。
そんなときは、値の項を1段下げて記述すると見やすくなります。
2つの「値」が同列に並ぶとともに、「条件」より1段下がることで従属関係が明確になるという利点があります。
//中央値 double median(const Array<int>& an){ return (an.size % 2) ? values[an.size/2] : 0.5*(values[an.size/2 - 1] + values[an.size/2]); } |
ちなみに、Ruby などのステートメントの終端が明示されない言語では、この方法は使えません。
(「条件」の評価値を返して終了してしまうため。)
この問題は、次のように ?
および :
演算子を行末に移動してやることで解決できます。
# 中央値 def median(const values) return (values.size % 2 != 0) ? an[an.size/2] : (an[an.size/2 - 1] + an[an.size/2])/2 end |
しかしながら、この記法はいまひとつエレガントさに欠けます。
ステートメントの終端をセミコロン (;
) で明示する僅かな手間を惜しみさえしなければ、こうした曖昧さはないのに……。
と、三項演算子を綴るたび、Ruby の文法に不満を覚える C++ 使いでありましたとさ。
担当: 成田 (句読点を抜かすんじゃあないッ!!)