コンテンツにスキップ

C言語/else

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

C言語の条件分岐制御において、if文と対になる重要な構造がelse文です。else文は、条件が偽と評価された場合の処理を定義するための仕組みを提供します。このセクションでは、else文の基本から応用まで体系的に解説します。

else文の基本構文

[編集]

else文は単独では使用できず、必ず先行するif文と組み合わせて使用します:

if (条件式) {
    // 条件式が真の場合に実行される文
} else {
    // 条件式が偽の場合に実行される文
}

以下に基本的な例を示します:

#include <stdio.h>
int main() {
    int temperature = 15;
    
    if (temperature > 20) {
        printf("暑いです。\n");
    } else {
        printf("暑くありません。\n");
    }
    
    return 0;
}

この例では、変数temperatureの値が20以下であるため、「暑くありません。」というメッセージが表示されます。

else if による複数条件の処理

[編集]

複数の条件を順次評価したい場合は、else if構文を使用します:

if (条件式1) {
    // 条件式1が真の場合
} else if (条件式2) {
    // 条件式1が偽で、条件式2が真の場合
} else if (条件式3) {
    // 条件式1と2が偽で、条件式3が真の場合
} else {
    // すべての条件式が偽の場合
}

以下に具体例を示します:

#include <stdio.h>
int main() {
    int month = 7;
    
    if (month >= 3 && month <= 5) {
        printf("春です。\n");
    } else if (month >= 6 && month <= 8) {
        printf("夏です。\n");
    } else if (month >= 9 && month <= 11) {
        printf("秋です。\n");
    } else {
        printf("冬です。\n");
    }
    
    return 0;
}

この例では、変数monthの値が7であるため、「夏です。」というメッセージが表示されます。

elseの結合規則(ダングリングelse問題)

[編集]

C言語では、elseは最も近い未対応のif文と結合するという規則があります。これはダングリングelse問題として知られています:

if (条件1)
    if (条件2)
        処理A;
    else
        処理B; // このelseは条件2のifに結合する

意図したとおりの処理を実現するには、波括弧を使用して明示的にブロックを区切ることが重要です:

#include <stdio.h>
int main() {
    int a = 5, b = 3;
    
    // 意図: aが正の場合、bの符号に応じて処理
    if (a > 0) {
        if (b > 0)
            printf("aとbは両方とも正です。\n");
        else
            printf("aは正ですが、bは0以下です。\n");
    } else {
        printf("aは0以下です。\n");
    }
    
    return 0;
}

この例では、波括弧によってelseの結合関係が明確になっています。

入れ子になったif-else文

[編集]

複雑な条件分岐を表現するために、if-else文を入れ子にすることができます:

#include <stdio.h>
int main() {
    int age = 25;
    char gender = 'M';
    
    if (age >= 18) {
        if (gender == 'M') {
            printf("成人男性です。\n");
        } else {
            printf("成人女性です。\n");
        }
    } else {
        if (gender == 'M') {
            printf("未成年男性です。\n");
        } else {
            printf("未成年女性です。\n");
        }
    }
    
    return 0;
}

この例では、年齢と性別に基づいて、4つの異なるメッセージのいずれかが表示されます。

else文を使用した実践的なパターン

[編集]

エラーハンドリングパターン

[編集]
#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE* file = fopen("data.txt", "r");
    
    if (file != NULL) {
        // ファイル操作のコード
        fclose(file);
        return EXIT_SUCCESS;
    } else {
        fprintf(stderr, "ファイルを開けませんでした。\n");
        return EXIT_FAILURE;
    }
}

条件に基づくリソース割り当て

[編集]
#include <stdio.h>
#include <stdlib.h>
int* allocate_array(int size) {
    if (size > 0) {
        int* array = (int*)malloc(size * sizeof(int));
        if (array != NULL) {
            return array;
        } else {
            fprintf(stderr, "メモリ割り当てに失敗しました。\n");
            return NULL;
        }
    } else {
        fprintf(stderr, "無効なサイズが指定されました。\n");
        return NULL;
    }
}

複雑なelse構造の代替手法

[編集]

非常に複雑な条件分岐は、可読性が低下する場合があります。そのような場合、以下の代替アプローチを検討することも有効です:

1. 早期リターンパターン

[編集]
#include <stdio.h>
int process_data(int value) {
    // 無効な入力の場合は早期リターン
    if (value < 0) {
        printf("エラー: 負の値は処理できません。\n");
        return -1;
    }
    
    // 特殊ケースの早期リターン
    if (value == 0) {
        return 0;
    }
    
    // メインの処理
    int result = value * 2;
    return result;
}

2. switch文の使用

[編集]

数値や列挙型の場合は、switch文がより明確な代替手段になることがあります:

#include <stdio.h>
int main() {
    int day = 3;
    
    switch (day) {
        case 1:
            printf("月曜日\n");
            break;
        case 2:
            printf("火曜日\n");
            break;
        case 3:
            printf("水曜日\n");
            break;
        case 4:
            printf("木曜日\n");
            break;
        case 5:
            printf("金曜日\n");
            break;
        default:
            printf("週末\n");
            break;
    }
    
    return 0;
}

elseに関する一般的なエラーと防止策

[編集]
エラーパターン 説明 防止策
波括弧の省略 複数の文を実行するときに波括弧を省略する 常に波括弧を使用する
ダングリングelse elseが意図しないifと結合する 波括弧を使用して明示的にブロックを区切る
冗長な条件 既に評価済みの条件を再評価する コードの流れを論理的に整理する
深すぎる入れ子 多数の入れ子になったif-elseで可読性が低下 条件を分解するか、早期リターンを使用

まとめ

[編集]

else文は、C言語の条件分岐の基本的な構成要素として重要な役割を果たしています。適切に使用することで、プログラムの流れを明確に表現し、コードの可読性と保守性を向上させることができます。