C言語 | フロー制御 | 真偽の判定

この記事では、値の大小を比較する関係演算子、値が等しいかを確認する等価演算子、条件を組み合わせる論理演算子を説明する。

関係演算と等価演算

プログラムでは、条件に応じて処理を分岐したり、繰り返したりする必要がある。C言語では、0を偽、0以外を真として扱う。比較演算子と論理演算子は、真偽を表す int 型の結果を返す。

関係演算子

演算子 結果
A < B AがBより小さい場合に真
A <= B AがB以下の場合に真
A > B AがBより大きい場合に真
A >= B AがB以上の場合に真

等価演算子

演算子 結果
A == B AとBが等しい場合に真
A != B AとBが等しくない場合に真

論理演算子

演算子 結果
A && B AとBがともに真の場合に真
`A
!A Aが偽の場合に真

等価判定には A == B を使う。A = B はBをAへ代入する。なお、(A = B + C) == 0 のように、代入式を意図的に条件へ利用することはできる。

論理演算子の優先順位は等価演算子より低く、等価演算子の優先順位は関係演算子より低い。

コード1

#include <stdio.h>

int main() {
 int iVar1 , iVar2;
 printf("2つの値を入力してください。 >");
 scanf("%d %d" , &iVar1 , &iVar2);

 printf("iVar1 == iVar2 = %d\n" , iVar1 == iVar2);
 printf("iVar1 < 1000 = %d\n" , iVar1 < 1000);
 printf("iVar1 < iVar2 && iVar1 > 100 = %d\n" ,
   (iVar1 < iVar2) && (iVar1 > 100));
 return 0;
}

&&|| は短絡評価を行う。A && B ではAが偽ならBを評価しない。A || B ではAが真ならBを評価しない。

コード2

#include <stdio.h>

int main() {
 int iVar = 0 , iTmp;
 iTmp = 0 && iVar++;
 printf("iVar = %d\n" , iVar);
 return 0;
}

左オペランドだけで偽と判断できるため、iVar++ は実行されない。副作用のある式を論理演算に含める場合は注意が必要である。

一方だけが真の場合に限って真になる排他的論理和(XOR)は、論理演算子を組み合わせて求められる。

(bool1 || bool2) && !(bool1 && bool2)

コード3

#include <stdio.h>

int main() {
 int iBool1 , iBool2;
 printf("2つの値を入力してください。 >");
 scanf("%d %d" , &iBool1 , &iBool2);
 printf("iBool1 XOR iBool2 = %d\n" ,
   (iBool1 || iBool2) && !(iBool1 && iBool2));
 return 0;
}