【C言語/C++】演算子として使われるはてな「?」三項演算子の使い方

C言語・C++には条件分岐に用いられる演算子「?」があります。

これは、三項演算子(さんこうえんざんし)といって、条件分岐を複合させた代入式を作成できます。

例えば、変数aが変数b以上のときはaを代入、違うときはbを代入するというプログラムを書くとしましょう。シンプルにif文を使って書く場合は以下のようになるはずです。

if (a >= b) {
	c = a;
}
else {
	c = b;
}

とにかく行数を削るなら下記のように書くことも可能です。

if(a >= b) c = a;
else c = b;

たった2行で代入式を分岐させることができますが、三項演算子はもっと短く書くことができます。

三項演算子を使った条件分岐・代入のコードは以下の通り。

c = a >= b ? a : b

「?」の前に条件式を書き、真だったっときと偽だったときに返す値を書くことで、たったの一行で条件分岐・代入の処理をかけてしまいます。

上記コードであれば、a >= bが真だったとき、aを返してcに代入。偽だったときはbを返してcに代入という形になります。

条件式 ? 真だったときの処理 : 偽だったときの処理

条件式を「?」で区切り、真と偽の処理を「:」で分けると覚えておきましょう。

目次から探す

代入に拘る必要はない

三項演算子は条件分岐に使うものなので、別に値の代入に拘る必要はありません。

ですので、以下のような使い方も有効です。

a > b ? func1() : func2();

絶対に変数 = 三項演算子を使った処理の形にする必要はありません。

三項演算子は代入式にせずに書くこともできるので覚えておくといいでしょう。

三項演算子は使い分けが必要

三項演算子は簡潔に一行でif/else文を書けてしまう便利な関数ですが、少しでも長くなると一気に可読性が低下します。

double result = a > b ? a : b;

上のコードなら三項演算子でも十分見やすいのですが、以下のコードだとどうでしょうか。

double result = Test::Div(alpha) * Test::Div(beta) > 0 ? Test::Sum(Div) : -1;

記号だらけですごく読みづらいはずです。これでもかなり短いほうですが、このような長くなった上で似たような記号がたくさん出てくるケースでは三項演算子を使うべきではないのです。

新しいことを覚えるとつい使いたくなる三項演算子ですが、うまく使いこなせてこその三項演算子です。下記のように書いたほうがシンプルでわかりやすいでしょう。

double result;
if( Test::Div(alpha) * Test::Div(beta) >0){
    result = Test::Sum(Div);
}else{
    result = -1;
}

if文であれば、どれだけ条件が複雑でもどこからどこまでが条件式なのかわかるので、可読性は落ちません。

変数名 = a > 0 ? a : b;のような、シンプルなケースのときだけ三項演算子を。もっと言うなら条件分岐は全てif/else文で書いてしまったほうがプログラムとしてはキレイで読みやすくなるでしょう。

可読性を低めてまで三項演算子を使うメリットはありません。プログラムを後で見てもすぐに分かるようにするためにも、本当に必要なときだけ三項演算子を使うようにしてください。

目次から探す