原文: Ternary Operator in C Explained
翻訳・翻案: Manabu Matsumoto

プログラマーは、長い if - else 条件文の代わりに三項演算子を使って、意思決定を行うことがあります。

三項演算子は 3 つの項をとります:

  1. 最初の項は比較演算式です
  2. 2 番目の項は、比較演算式が true の時に、結果として評価される式です
  3. 3 番目の項は、比較演算式が false の時に、結果として評価される式です

三項演算子を、簡潔に記述する方法、または if-else 文を記述する方法として考えてみると役に立ちます。 例えば、まず次のように、単純な意思決定に ifelse を使用する場合を見てみましょう:

int a = 10, b = 20, c;

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

printf("%d", c);

この例では 10 行以上を使用していますが、そんなには必要はありません。三項演算子を使用することで、上記のプログラムを、たった 3 行のコードで記述できます。

構文

condition ? value_if_true : value_if_false

この文は、condition を満たしている場合には value_if_true を評価し、そうでなければ value_if_false を評価します。

三項演算子を使用して書き換えられた上記の例がこちらです:

int a = 10, b = 20, c;

c = (a < b) ? a : b;

printf("%d", c);

条件文 a < b が true なので、ca と同じ値に設定されます。

value_if_truevalue_if_false の項は、同じ型の値である必要があり、また、完全な文ではなく単純な式でなければならないことを覚えておいてください。

また、三項演算子は if-else 文のように入れ子にできます。次のコードについて考えてみましょう:

int a = 1, b = 2, ans;
if (a == 1) {
    if (b == 2) {
        ans = 3;
    } else {
        ans = 5;
    }
} else {
    ans = 0;
}
printf ("%d\n", ans);

上記のコードを、入れ子にした三項演算子を用いて書き換えた例がこちらです:

int a = 1, b = 2, ans;
ans = (a == 1 ? (b == 2 ? 3 : 5) : 0);
printf ("%d\n", ans);

両方の一連のコードの出力は、次のようになるはずです:

3