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 && ba と b の両方が成り立つか

評価結果のルール(論理和 a && b)

aba && b
非0非01
非000
0非00
000

※ 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 || ba と b のどちらか一方でも成り立つか

評価結果のルール

評価結果のルール(論理和 a || b)

a の値b の値a || b の評価結果
非0非01
非001
0非01
000

※ 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 && ba が 0 のとき、b を評価しない
a || ba が 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;
}