条件演算子 条件分岐3

条件演算子(三項演算子)

条件演算子は、ある条件式の判定結果によって実行する式を選択する演算子です。
演算に三つの項目を用いるので三項演算子とも言います。

これはサンプルコードを見たほうがわかりやすいです。


#include <stdio.h>

int main()
{
    int kazu1 = 5;
    int kazu2 = 7;

    //条件演算子
    int max = kazu1 > kazu2 ? kazu1 : kazu2;

    printf("%d", max);
    getchar();
}
7

9行目、変数maxの右辺(=の右側)が条件演算子を使った条件判定です。

条件式 ? 式1 : 式2
条件式が真の時に式1を、偽の時に式2を実行する。

条件演算子は?:の記号の組み合わせです。
条件式を判定した結果、真の場合には式1が、偽の場合には式2が実行されます。
全部で式が三つ必要なので、三項演算子と呼ばれます。

このコードではkazu1 > kazu2の比較が成立する時は変数kazu1の値が、成立しないときは変数kazu2の値が返ってきます。
結果として変数maxには二つの変数のうち大きい方の値が代入されます。

上のサンプルコードをif文で書き換えると以下のようになります。


#include <stdio.h>

int main()
{
    int kazu1 = 5;
    int kazu2 = 7;
    int max;

    if(kazu1 > kazu2)
        max = kazu1;
    else
        max = kazu2;

    printf("%d", max);
    getchar();
}

特定の条件によって変数に代入する値を変えたい場合は条件演算子のほうが簡潔に書けます。

二項演算子と単項演算子

算術演算子(+/など)や関係演算子(比較演算子)、代入演算子(=)などは、演算に値がふたつ必要なので二項演算子という分類になります。

+演算子と-演算子は二つの値の計算を行う二項演算子としての役割もありますが、数値の前に単独で指定する事も可能です。
これは単項演算子といいます。


int a = 1;

//単項演算子としての+と-
int b = +a; //1
int c = -a; //-1

単項+演算子は特に意味はありませんが、単項-演算子はその値のプラスとマイナスを入れ替える機能があります。
(符号の反転)

C言語では三項を使用する演算子はこのページで説明する条件演算子だけなので、三項演算子と条件演算子は同じ意味となります。

式の型と評価値の型

条件演算子の二つの式のデータ型(評価で得られる値の型)は、数値型同士か、同じデータ型(後述)である必要があります。
数値型のそれぞれの型が異なる場合は暗黙の型変換が行われ、それが条件演算の評価値およびデータ型となります。
void型の式も実行式に指定できますが、その場合は条件演算は値を返さないので結果を変数等に格納することはできません。


#include <stdio.h>

int f_int1() { return 1; }
int f_int2() { return 1; }
double f_double() { return 1.0; }
void f_void1() {}
void f_void2() {}

int main()
{
    //OK
    0 ? f_int1() : f_int2();
    0 ? f_void1() : f_void2();
    int a = 0 ? f_int1() : f_int2();
    double b = 0 ? f_int1() : f_double(); //int型はdouble型に変換される

    //NG
    //int c = 0 ? f_int1() : f_void1();  //片方が値を返さない
    //int d = 0 ? f_void1() : f_void2(); //両方が値を返さない
}

ここでいう「同じデータ型」とは、同じ構造体共用体、およびポインタ型のことです。
ただしポインタ型は、通常のポインタ型(int*型など)と、定数NULLおよびvoid*型と同時に指定可能です。
int*型と定数NULLを指定した場合はint*型、int*型とvoid*型を指定した場合はvoid*型が条件演算子の評価値の型になります。

これらの型についてはまだ説明していないので参考程度にみてください。

条件演算子の入れ子

条件演算子は入れ子にして使うことで、複雑な条件判定を行うこともできます。


#include <stdio.h>

int main()
{
    int kazu1 = 2;
    int kazu2 = 6;
    int kazu3 = -8;

    int max = kazu1 > kazu2 ?
        kazu1 > kazu3 ?
            kazu1 : kazu3 :
        kazu2 > kazu3 ?
            kazu2 : kazu3;

    printf("%d", max);
    getchar();
}
6

このコードは、それぞれの変数の中で一番大きな値が変数maxに代入されます。

ただ、このような条件演算子の入れ子はかえってコードの可読性(見やすさ)が低下するおそれがあります。
一行で済ますのではなく数行に分けるか、素直にif文を使ったほうが見やすくなることもあります。