C言語基礎|条件演算子

条件演算子とは何か

これまでは、条件によって処理を分岐させるために if 文を使ってきました。
if 文はとても分かりやすく、基本中の基本です。

一方で C言語には、
「条件によって値そのものを切り替える」 ための演算子も用意されています。

それが 条件演算子 です。

条件演算子を使うと、

  • 条件に応じて異なる値を作り出す。
  • if 文を使わずに、1つの式として書ける。

という特徴があります。

条件演算子の形

条件演算子は、C言語で唯一の 3項演算子 です。

形式意味
a ? b : ca が非0なら b、そうでなければ c

この形は必ず守らなければなりません。

  • a は条件となる式
  • b は条件が成立したときの値
  • c は条件が成立しなかったときの値

条件演算子は です。
そのため、評価すると「値」が得られます。

条件式の評価の流れ

条件演算子を含む式は、次の順序で評価されます。

式1 ? 式2 : 式3
  1. まず 式1 を評価する
  2. 式1 の値が
    ・非0 → 式2 を評価し、その値が全体の値になる。
    ・0 → 式3 を評価し、その値が全体の値になる

重要なのは、
式2 と 式3 の両方が評価されるわけではない
という点です。

サンプルプログラム①

ここでは、次の処理を行うプログラムを考えます。

二つの整数を読み込み、より小さい値を表示する

プログラム例

プロジェクト名:chap3-8-1 ソースファイル名:chap3-8-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。");
    printf("A:"); scanf("%d", &a);
    printf("B:"); scanf("%d", &b);

    int smaller = a < b ? a : b;

    printf("小さいほうの値は%dです。\n", smaller);

    return 0;
}

処理の考え方

  • a < b が非0なら a を選ぶ
  • そうでなければ b を選ぶ

この結果がそのまま変数 smaller に代入されます。

if 文との対応関係

条件演算子は、次の if 文を 1行の式にまとめたもの と考えると理解しやすくなります。

if 文で書いた場合

int smaller;

if (a < b)
    smaller = a;
else
    smaller = b;

条件演算子で書いた場合

int smaller = a < b ? a : b;

処理内容はまったく同じですが、
条件演算子のほうが「値を決める処理」であることがはっきりしています。

サンプルプログラム②(差の絶対値を求める)

条件演算子は、値の加工にもよく使われます。

ここでは次の処理を行います。

二つの整数の差を、必ず正の値で表示する

プログラム例

プロジェクト名:chap3-8-2 ソースファイル名:chap3-8-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int x, y;

    puts("二つの整数を入力してください。");
    printf("X:"); scanf("%d", &x);
    printf("Y:"); scanf("%d", &y);

    int diff = x > y ? x - y : y - x;

    printf("二つの値の差は%dです。\n", diff);

    return 0;
}

条件式の意味

条件評価される式
x > y が非0x - y
x > y が0y - x

常に「大きい値 − 小さい値」が選ばれるため、
結果は必ず正の値になります。

条件演算子を使うときの注意点

条件演算子は便利ですが、使いすぎには注意が必要です。

良い使いどころ

  • 単純な条件で値を切り替える。
  • max や min を求める。
  • 表示内容や代入値を切り替える。

避けたほうがよい例

  • 条件が複雑すぎる。
  • 条件演算子を入れ子にする。
  • 読みにくくなる場合

可読性が下がる場合は、素直に if 文を使いましょう。

if 文と条件演算子の使い分け

観点if 文条件演算子
処理の分岐得意不向き
値の決定やや冗長得意
可読性高い短いが注意が必要
式として使えるできないできる

まとめ

  • 条件演算子 ?: は C言語唯一の3項演算子
  • 条件に応じて異なる値を生成する式
  • if 文を「値の決定」に特化させた形
  • 簡潔に書けるが、読みやすさを意識することが重要