C言語

【C言語】第2章第15回:条件分岐を最適化するテクニック

条件分岐は、プログラムの動作を制御する重要な要素です。この章では、if文、switch文などを効率的に記述し、最適化するテクニックを学びます。

1. 条件分岐の基本と課題

条件分岐を最適化する際には、以下の課題を考慮する必要があります:

  • 条件式の評価回数を減らす。
  • 分岐の順序を工夫し、プログラムを効率化する。
  • 可読性を維持しながら冗長なコードを排除する。

2. 条件分岐の最適化テクニック

2.1 簡潔な条件式の記述

複雑な条件式を簡潔に記述することで、コードの可読性を向上させます。

例:2つの値が同じかどうかを判定するプログラム

#include <stdio.h>

int main() {
    int a = 5, b = 5;

    // 冗長な条件
    if (a == b) {
        printf("Equal\n");
    }

    // 簡潔な条件
    printf("%s\n", (a == b) ? "Equal" : "Not Equal");

    return 0;
}

解説:

  • if文を三項演算子に置き換えることで、簡潔に記述。
  • 可読性を損なわない範囲でコードを短縮。

2.2 条件の順序を工夫する

頻繁に成立する条件を先に評価することで、条件式全体の評価回数を減らします。

例:値が範囲内かを判定するプログラム

#include <stdio.h>

int main() {
    int value = 10;

    // 順序を工夫
    if (value >= 0 && value <= 100) {
        printf("Value is within range.\n");
    }

    return 0;
}

解説:

  • 頻度の高い条件(value >= 0)を先に評価。
  • 短絡評価を活用して不要な評価を回避。

3. 複雑な条件を整理する

複雑な条件式を関数に分割し、コードを整理します。

例:値が偶数かつ正の数かを判定するプログラム

#include <stdio.h>

int is_positive_even(int value) {
    return value > 0 && value % 2 == 0;
}

int main() {
    int value = 10;

    if (is_positive_even(value)) {
        printf("Value is a positive even number.\n");
    } else {
        printf("Value is not a positive even number.\n");
    }

    return 0;
}

解説:

  • 条件式を関数is_positive_evenに分割して簡潔化。
  • コードの再利用性を向上。

4. switch文の活用

多数の選択肢を処理する場合、switch文を使用して効率化します。

例:曜日を文字列に変換するプログラム

#include <stdio.h>

int main() {
    int day = 2;

    switch (day) {
        case 0:
            printf("Sunday\n");
            break;
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        default:
            printf("Invalid day\n");
    }

    return 0;
}

解説:

  • switch文を使用して、多数の条件を効率的に処理。
  • breakを適切に配置し、意図しない処理を防止。

5. 練習問題

以下の課題に挑戦し、条件分岐の最適化を練習してください。

  1. 三項演算子を使用して、正の数か負の数かを判定するプログラムを作成してください。
  2. 複数の条件を関数に分割して、偶数または3の倍数を判定するプログラムを作成してください。
  3. switch文を使用して、1〜5の数値に応じたメッセージを表示するプログラムを作成してください。

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

問1の解答

#include <stdio.h>

int main() {
    int value = -10;

    printf("%s\n", (value >= 0) ? "Positive" : "Negative");

    return 0;
}

問2の解答

#include <stdio.h>

int is_even(int value) {
    return value % 2 == 0;
}

int is_multiple_of_three(int value) {
    return value % 3 == 0;
}

int main() {
    int value = 9;

    if (is_even(value)) {
        printf("Value is even.\n");
    } else if (is_multiple_of_three(value)) {
        printf("Value is a multiple of three.\n");
    } else {
        printf("Value is neither even nor a multiple of three.\n");
    }

    return 0;
}

問3の解答

#include <stdio.h>

int main() {
    int value = 3;

    switch (value) {
        case 1:
            printf("One\n");
            break;
        case 2:
            printf("Two\n");
            break;
        case 3:
            printf("Three\n");
            break;
        case 4:
            printf("Four\n");
            break;
        case 5:
            printf("Five\n");
            break;
        default:
            printf("Invalid value\n");
    }

    return 0;
}

7. まとめ

条件分岐の最適化により、コードの効率と可読性が向上します。三項演算子や関数の分割、switch文を活用して、より効率的なプログラムを作成しましょう。