C言語

【C言語】第2章第11回:条件文での短絡評価の理解と応用

短絡評価(ショートサーキット評価)は、条件文を効率的に評価するための重要な仕組みです。この章では、論理演算子&&(AND)と||(OR)を用いた短絡評価の仕組みや応用例を学びます。

1. 短絡評価とは?

短絡評価とは、条件式の一部だけを評価して、結果が確定した時点で残りの評価を省略する仕組みです。

論理演算子と短絡評価の動作

  • &&(AND):最初に偽(false)の条件が見つかると、残りの条件を評価せずに偽を返します。
  • ||(OR):最初に真(true)の条件が見つかると、残りの条件を評価せずに真を返します。

例:

if (a != 0 && b / a > 1) {
    // aが0でない場合のみb / aを評価
}

この例では、aが0の場合、b / aは評価されず、ゼロ除算エラーを回避します。

2. 短絡評価の基本例

以下のプログラムは、短絡評価を利用してゼロ除算を回避します。

#include <stdio.h>

int main() {
    int a = 0, b = 10;

    if (a != 0 && b / a > 1) {
        printf("Condition is true.\n");
    } else {
        printf("Condition is false.\n");
    }

    return 0;
}

解説:

  • a != 0が偽の場合、b / aは評価されません。
  • ゼロ除算エラーを回避し、安全にプログラムを実行できます。

3. 短絡評価を利用した効率的な条件文

短絡評価は、条件を効率的に評価する際に役立ちます。

例:関数の呼び出しを制限

#include <stdio.h>

int is_positive(int n) {
    printf("Checking if %d is positive.\n", n);
    return n > 0;
}

int main() {
    int x = 5, y = -10;

    if (x > 0 && is_positive(y)) {
        printf("Both conditions are true.\n");
    } else {
        printf("At least one condition is false.\n");
    }

    return 0;
}

解説:

  • x > 0が偽の場合、is_positive(y)は呼び出されません。
  • 不要な関数呼び出しを回避し、効率的な処理を実現します。

4. 注意点:短絡評価が引き起こす問題

短絡評価には、以下のような注意点があります:

  • 条件の順序が重要です。不適切な順序は予期せぬ動作を引き起こす可能性があります。
  • 副作用を持つ関数の呼び出しがスキップされる場合があります。

例:条件の順序が重要な場合

#include <stdio.h>

int main() {
    int a = 0, b = 10;

    if (b / a > 1 && a != 0) { // 条件の順序が逆
        printf("This will cause an error.\n");
    }

    return 0;
}

この例では、b / aが先に評価され、ゼロ除算エラーが発生します。

5. 練習問題

以下の課題に挑戦し、短絡評価の使い方を練習してください。

  1. ユーザーに2つの数値を入力させ、最初の数値が0でない場合のみ2つ目の数値を割り算して結果を表示するプログラムを作成してください。
  2. 論理演算子||を使い、少なくとも1つの条件が真である場合に特定のメッセージを表示するプログラムを作成してください。
  3. 関数呼び出しを含む条件文を記述し、短絡評価による効率的な処理を実現するプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int a, b;

    printf("Enter two numbers: ");
    scanf("%d %d", &a, &b);

    if (a != 0 && b / a > 1) {
        printf("Result: %d\n", b / a);
    } else {
        printf("Division not performed.\n");
    }

    return 0;
}

問2の解答

#include <stdio.h>

int main() {
    int x = 5, y = -10;

    if (x > 0 || y > 0) {
        printf("At least one condition is true.\n");
    } else {
        printf("Both conditions are false.\n");
    }

    return 0;
}

問3の解答

#include <stdio.h>

int is_even(int n) {
    printf("Checking if %d is even.\n", n);
    return n % 2 == 0;
}

int main() {
    int x = 4;

    if (x > 0 && is_even(x)) {
        printf("The number is positive and even.\n");
    } else {
        printf("Condition not satisfied.\n");
    }

    return 0;
}

7. まとめ

短絡評価は、条件文を効率的に評価する際に役立つ重要な仕組みです。練習問題を通じて、その応用力を身につけ、プログラムの安全性と効率性を向上させましょう。