
C言語基礎|論理演算子
論理演算子とは
ここまでで、関係演算子を使って
「大きいか」「等しいか」といった条件を判定してきました。
今回はさらに一歩進んで、
複数の条件を組み合わせて判定する方法 を学びます。
そのために使うのが、論理演算子です。

問題設定
次の問題を考えてみましょう。
読み込んだ数値が「安全な範囲」に入っているかを判定する
条件は次のとおりです。
- 10以上 50以下 → 正常な値
- それ以外 → 範囲外
さらに、
- 値が 0 または 100 のときは「特別な値」と表示
サンプルプログラム
プロジェクト名:chap3-10-1 ソースファイル名:chap3-10-1.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
#include <stdio.h>
int main(void)
{
int value;
printf("数値を入力してください:");
scanf("%d", &value);
if (value >= 10 && value <= 50)
printf("%d は正常な範囲です。\n", value);
else if (value == 0 || value == 100)
printf("%d は特別な値です。\n", value);
else
printf("%d は範囲外の値です。\n", value);
return 0;
}実行例
数値を入力してください:25
25 は正常な範囲です。
数値を入力してください:0
0 は特別な値です。
数値を入力してください:72
72 は範囲外の値です。論理 AND 演算子(&&)
最初の判定で使っているのが、論理 AND 演算子です。
書式
| 書式 | 意味 |
|---|---|
| a && b | a と b の両方が成り立つか |
評価結果のルール(論理和 a && b)
| a | b | a && b |
|---|---|---|
| 非0 | 非0 | 1 |
| 非0 | 0 | 0 |
| 0 | 非0 | 0 |
| 0 | 0 | 0 |
※ C言語などでは、非0 は真(1), 0 は偽(0)として評価されます。
そのため、a と b の両方が非0であれば、a && b は 1 になります。
文書で表すと、
「a かつ b」
に相当します。
プログラム中の例
value >= 10 && value <= 50これは、
- value が 10以上 かつ
- value が 50以下
の両方を満たすときだけ 1 になります。
論理 OR 演算子(||)
次に使っているのが、論理 OR 演算子です。
書式
| 書式 | 意味 |
|---|---|
| a || b | a と b のどちらか一方でも成り立つか |
評価結果のルール
評価結果のルール(論理和 a || b)
| a の値 | b の値 | a || b の評価結果 |
|---|---|---|
| 非0 | 非0 | 1 |
| 非0 | 0 | 1 |
| 0 | 非0 | 1 |
| 0 | 0 | 0 |
※ C言語などでは、非0 は真(1), 0 は偽(0)として評価されます。
そのため、a または b のどちらか一方でも非0であれば、a || b は 1 になります。
日本語では、
「a または b」
に相当します。
プログラム中の例
value == 0 || value == 100これは、
- value が 0 または
- value が 100
のどちらか一方でも成り立てば 1 になります。
論理式は左から評価される
論理演算子は、左から順に評価されます。
a || b || c
は、
(a || b) || c
として評価されます。
そのため、
- a が非0なら、その時点で全体が 1
- a が 0 なら b を評価
- b も 0 なら c を評価
という流れになります。
短絡評価(ショートサーキット)
論理演算子には、とても重要な特徴があります。
| 演算子 | 評価を省略する条件 |
|---|---|
| a && b | a が 0 のとき、b を評価しない |
| a || b | a が 1 のとき、b を評価しない |
これを 短絡評価 と呼びます。
文章で説明すると、
- AND は「もうダメ」と分かったら先を見ない。
- OR は「もうOK」と分かったら先を見ない。
という動きです。
論理演算子のまとめ
| 演算子 | 意味 | 評価結果 |
|---|---|---|
| && | 論理 AND | 両方が非0なら 1 |
| || | 論理 OR | どちらかが非0なら 1 |
どちらも、
- 結果は 1 または 0
- 型は int
になります。
演習問題
演習3-7
三つの整数値 A、B、C を読み込み、
- A、B、C がすべて等しければ
「三つの値はすべて等しいです。」 - どれか二つだけが等しければ
「二つの値が等しいです。」 - すべて異なれば
「三つの値はすべて異なります。」
と表示するプログラムを作成せよ。
解答例
#include <stdio.h>
int main(void)
{
int a, b, c;
puts("三つの整数を入力せよ。");
printf("A:"); scanf("%d", &a);
printf("B:"); scanf("%d", &b);
printf("C:"); scanf("%d", &c);
if (a == b && b == c)
puts("三つの値はすべて等しいです。");
else if (a == b || b == c || a == c)
puts("二つの値が等しいです。");
else
puts("三つの値はすべて異なります。");
return 0;
}