C言語基礎|短絡評価

短絡評価とは何か

論理演算子を使った条件式では、すべての式が必ず評価されるとは限りません
ある時点で「結果が確定した」と分かった瞬間に、残りの評価を行わずに終了する仕組みがあります。
これを 短絡評価(short circuit evaluation) と呼びます。

「もう答えが分かっているのに、わざわざ続きを調べない」
―そんな、人間の判断にとても近い動きです。

論理 AND(&&)における短絡評価

まず、論理 AND 演算子 && から見ていきましょう。

評価の考え方


month >= 3 && month <= 5
は、「3以上かつ5以下なら春」という意味です。

ここで、month の値が 2 だったとします。

評価対象評価結果
month >= 30(偽)
month <= 5評価されない
式全体0

左側の month >= 3 が偽になった時点で、
「両方が真でなければならない」AND の条件は成立しません。

そのため 右側を調べる必要がなくなり、評価が省略されます。

論理 OR(||)における短絡評価

次に、論理 OR 演算子 || を見てみましょう。

評価の考え方

冬の判定を次のように書くとします。

month == 1 || month == 2 || month == 12

ここで、month が 1 の場合を考えます。

評価対象評価結果
month == 11(真)
month == 2評価されない
month == 12評価されない
式全体1

OR は「どれか一つでも真なら成立」です。
左端で真が確定した瞬間に、残りを調べる意味がなくなります

そのため、右側の評価はすべて省略されます。

短絡評価が行われる理由

短絡評価が行われる理由は、大きく分けて2つあります。

理由説明
無駄な処理を避ける結果が確定している評価を行わない。
安全性を高める危険な処理を実行しないですむ。

特に後者は、実務でも非常に重要です。

安全性を高める短絡評価の例

次の条件式を考えてみましょう。

divisor != 0 && value / divisor > 10
状態動作
divisor が 0左が偽 → 右は評価されない。
divisor が 非0左が真 → 右を評価

短絡評価のおかげで、ゼロ除算が発生しません
これは、単なる高速化ではなく 安全なプログラムを書くための仕組み です。

短絡評価のルールまとめ

短絡評価のルールを表にまとめておきましょう。

演算子左オペランドの結果右オペランド
&&偽(0)評価されない
&&真(非0)評価される
||真(非0)評価されない
||偽(0)評価される

この表を覚えておけば、条件式の挙動で迷うことはほとんどなくなります。

重要ポイント

  • 短絡評価は && と || に必ず適用される。
  • 結果が確定した時点で、右オペランドは評価されない。
  • 処理の高速化だけでなく、安全性の向上にも役立つ。

演習問題(短絡評価を意識して書いてみよう)

演習3-8

二つの整数値を読み込み、それらの値の差が
10 以下であれば
それらの差は 10 以下です。

そうでなければ
それらの差は 11 以上です。

と表示するプログラムを作成せよ。
論理 OR 演算子を利用すること。

解答例

プロジェクト名:chap3-11-1 ソースファイル名:chap3-11-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力せよ。");
    printf("整数A:"); scanf("%d", &a);
    printf("整数B:"); scanf("%d", &b);

    if (a - b <= 10 || b - a <= 10)
        puts("それらの差は10以下です。");
    else
        puts("それらの差は11以上です。");

    return 0;
}

解説

  • a - b が 10 以下なら即真
  • 偽の場合のみ b - a を評価
  • OR の短絡評価を自然に活用した条件式です。

ここまで理解できれば、
論理演算子 × if 文 × 安全な条件式 はもう怖くありません。