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;
}