読者です 読者をやめる 読者になる 読者になる

三項演算子

C/C++ をはじめとして、多くの言語では「三項演算子」がサポートされています。

1. 三項演算子の使用例
//偶奇性の表示
void PrintParity(int n){
puts((n % 2 == 0) ? "even" : "odd");
}

処理の内容が同じでパラメータだけが異なるような処理の場合、三項演算子を上手く使うとコードが簡潔になります。

2. if ステートメントによる分岐
//偶奇性の表示
void PrintParity(int n){
if (n % 2 == 0)
puts("even");
else
puts("odd");
}

しかし、「条件 (第 1項)」や「値 (第 2, 3項)」が長い場合は、コードが横にだらだらと伸びてしまい美しくありません。
そんなときは、値の項を1段下げて記述すると見やすくなります。
2つの「値」が同列に並ぶとともに、「条件」より1段下がることで従属関係が明確になるという利点があります。

3. 段下げした三項選択
//中央値
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 などのステートメントの終端が明示されない言語では、この方法は使えません。 (「条件」の評価値を返して終了してしまうため。)
この問題は、次のように ? および : 演算子を行末に移動してやることで解決できます。

4. 段下げした三項選択 (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++ 使いでありましたとさ。

担当: 成田 (句読点を抜かすんじゃあないッ!!)