C言語のきほん|条件演算子

ifを1行にギュッ。条件演算子で、分岐をスマートに書けるようになろう。

条件演算子は「小さな分岐」を気持ちよく書く道具

C言語で分岐といえば if が定番ですが、毎回 if~else~ を書くほどでもない“ちょい分岐”ってけっこう出てきます。
たとえば、

  • 大きい方の値を入れたい
  • 条件で表示する文字だけ変えたい
  • エラー表示か通常表示かを1行で切り替えたい

こういう場面で活躍するのが 条件演算子 です。
見た目はちょっとクセがあるけど、慣れると「これ、気持ちいいな…」ってなりますよ。

条件演算子の文法

条件演算子はこの形です。

条件式 ? 式1 : 式2

意味はシンプルで、

  • 条件式が真なら式1
  • 条件式が偽なら式2

が選ばれます。

まずは図でイメージ

ポイントはここです。
条件演算子は「文」じゃなくて「式」なので、評価結果(値)を持つんですね。だから代入の右側に置けます。

if~else~との対応(同じ意味になる)

たとえば次の条件演算子は、

max = (a >= b) ? a : b;

次の if~else~ と同じ動きです。

  • a >= b なら max に a
  • そうでなければ max に b

ifで書くとこうなります。

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

対応表で見るとこんな感じ

書き方目的特徴
if~else~条件で処理を分ける複数行の処理に強い
条件演算子条件で値を選ぶ1行で書けてスッキリ

条件演算子は「処理を分ける」というより 値を選ぶのが得意です。

使いどころのコツ:条件演算子が得意な場面

値を選んで代入するとき

  • 大きい方
  • 小さい方
  • 文字列(表示メッセージ)を切り替え
  • 0なら特別表示、そうでなければ通常表示

printfの一部だけ変えたいとき

  • OK/NG を切り替える
  • 記号を切り替える(○/×、+/- など)
  • 改行するかスペースにするか

逆に、条件演算子が苦手な場面もあります。

ちょっと苦手理由
3段以上の複雑な分岐読みにくくなりやすい
式の中で重たい処理をする何をしてるか追いづらい
式1と式2の型がバラバラ意図しない型変換が起きやすい

サンプルプログラム

例:点数から合否メッセージを1行で作る

  • 60点以上なら 合格です
  • 60点未満なら もう少しです

条件演算子で、表示メッセージを切り替えます。

ファイル名:8_10_1.c

// 条件演算子で合否メッセージを切り替えるプログラム
#include <stdio.h>

int main(void)
{
    int score;

    printf("点数を入力してください(0~100)> ");
    scanf("%d", &score);

    // 60点以上なら「合格です」、それ以外は「もう少しです」
    printf("%s\n", (score >= 60) ? "合格です。" : "もう少しです。");

    return 0;
}

実行イメージ

点数を入力してください(0~100)> 75
合格です。

点数を入力してください(0~100)> 40
もう少しです。

この例の気持ちよさは、if~else~で3〜5行になる部分が、1行でスッと書けるところです。

例1:2つの値の大きい方を選ぶ(定番パターン)

文書にある例は超重要なので、考え方だけスッキリ整理します。

max = (a >= b) ? a : b;

これを読むコツは、

  • 条件 a >= b が真なら a
  • 偽なら b
  • その結果を max に代入

という順番で読むことです。

読み方テンプレ(慣れると速い)

(条件) ? 真のときの値 : 偽のときの値

例2:一定間隔で改行する(printfと相性がいい)

文書の例は、10ごとに改行するテクニックでした。
ポイントはここです。

(i % 10) ? ' ' : '\n'
  • i % 10 が 0じゃない → 真 → ' '(スペース)
  • i % 10 が 0 → 偽 → '\n'(改行)

ん?ってなりやすいのは、C言語では 0 が偽、0以外が真 というルールがあるからです。

真偽のルール(Cの基本)

判定
0
0以外

だから、i % 10 が 0 のときだけ偽になって改行が選ばれる、という仕組みです。

条件演算子の注意点(つまずきやすいところ)

式1と式2は「どちらか一方だけ」評価される

条件演算子は、条件に応じて片方しか選ばれません。

  • 条件が真なら式1だけ評価
  • 条件が偽なら式2だけ評価

この性質は便利でもあり、注意点でもあります。
たとえば、式の中で副作用(代入や関数呼び出し)を混ぜると、挙動を読み間違えやすくなります。

ネスト(入れ子)しすぎると急に読みにくい

条件演算子を重ねると書けてしまいますが、初心者にはかなり読みにくくなりがちです。

書き方読みやすさ
単純な1段読みやすい
2段以上の入れ子急にしんどい

2段以上になるなら、素直にif~else if~else~で書いた方が、将来の自分にも優しいです。

表現をもう少し工夫する例:表示の一部だけ切り替える

条件演算子は、文字1個だけ切り替えるのも得意です。

たとえば偶数なら ○、奇数なら × を表示するとします。

  • n % 2 が 0なら偶数
  • そうでなければ奇数
printf("判定:%c\n", (n % 2 == 0) ? '○' : '×');

こういう「表示の差分だけを変える」場面では、条件演算子はかなり強い味方です。