【6日でできるC言語入門】複雑な if 文

 C言語のプログラミングにおいて、if文はもっとも基本的な分岐処理の構文です。これまで単純な条件分岐について学んできましたが、実際の開発現場では「複数の条件を組み合わせて判定したい」「より細かく分岐したい」といったニーズが生まれます。
このような場合、論理演算子やif文のネスト(入れ子構造)を活用して、より複雑な条件分岐を記述することが重要です。

本記事では、複雑な if 文を正しく使いこなすための知識を、表や具体例を交えて解説します。

1.論理演算子を使った複雑な if 文

1.1. 論理演算子の基本

論理演算子は、複数の条件をまとめて判定するときに使います。C言語でよく使う論理演算子は次の通りです。

演算子名称意味使用例例の意味
&&論理積(AND)両方成立x >= 10 && y < 50xは10以上、かつyは50未満
||論理和(OR)どちらか成立x == 0 || y == 0xまたはyが0
!否定(NOT)条件の反転!(x > 0)xが0以下

1.2. AND(&&)を使った判定例

サンプルプログラム1:2つの年齢が両方とも20歳以上か判定

プロジェクト/ファイル名: Lesson22_1/main.c

#include <stdio.h>

int main(void) {
    int age1, age2;
    printf("1人目の年齢を入力してください: ");
    scanf("%d", &age1);
    printf("2人目の年齢を入力してください: ");
    scanf("%d", &age2);

    if (age1 >= 20 && age2 >= 20) {
        printf("2人とも20歳以上です。\n");
    } else {
        printf("どちらかが20歳未満です。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

1人目の年齢を入力してください: 25
2人目の年齢を入力してください: 30
2人とも20歳以上です。

1人目の年齢を入力してください: 19
2人目の年齢を入力してください: 21
どちらかが20歳未満です。
age1 >= 20age2 >= 20結果
TrueTrue2人とも20歳以上
TrueFalseどちらかが20歳未満
FalseTrueどちらかが20歳未満
FalseFalseどちらかが20歳未満

1.3. OR(||)を使った判定例

サンプルプログラム2:どちらかの点数が80点以上か判定

プロジェクト/ファイル名: Lesson22_2/main.c

#include <stdio.h>

int main(void) {
    int score1, score2;
    printf("1人目の点数を入力してください: ");
    scanf("%d", &score1);
    printf("2人目の点数を入力してください: ");
    scanf("%d", &score2);

    if (score1 >= 80 || score2 >= 80) {
        printf("どちらかが80点以上です。\n");
    } else {
        printf("両方とも80点未満です。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

1人目の点数を入力してください: 85
2人目の点数を入力してください: 70
どちらかが80点以上です。

1人目の点数を入力してください: 60
2人目の点数を入力してください: 70
両方とも80点未満です。
score1 >= 80score2 >= 80結果
TrueTrueどちらかが80点以上
TrueFalseどちらかが80点以上
FalseTrueどちらかが80点以上
FalseFalse両方とも80点未満

1.4. NOT(!)を使った判定例

サンプルプログラム3:数が0でないかを判定

プロジェクト/ファイル名: Lesson22_3/main.c

#include <stdio.h>

int main(void) {
    int num;
    printf("整数を入力してください: ");
    scanf("%d", &num);

    if (!(num == 0)) {
        printf("0ではありません。\n");
    } else {
        printf("0です。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

整数を入力してください: 8
0ではありません。

2.if文のネスト(入れ子)による複雑な条件分岐

2.1. if文のネストの基本

if文の中にさらにif文を書くことで、より細かい条件分岐ができます。これをif文のネスト(入れ子構造)といいます。

2.2. ネストを使ったサンプル

サンプルプログラム4:季節と気温で服装を判断

プロジェクト/ファイル名: Lesson22_4/main.c

#include <stdio.h>

int main(void) {
    int season, temperature;
    printf("季節を選んでください(1:春, 2:夏, 3:秋, 4:冬): ");
    scanf("%d", &season);
    printf("気温を入力してください(℃): ");
    scanf("%d", &temperature);

    if (season == 2) { // 夏
        if (temperature >= 30) {
            printf("Tシャツがおすすめです。\n");
        } else {
            printf("薄手のシャツがおすすめです。\n");
        }
    } else if (season == 4) { // 冬
        if (temperature <= 5) {
            printf("厚手のコートが必要です。\n");
        } else {
            printf("セーターがおすすめです。\n");
        }
    } else {
        printf("季節に合った服装を選んでください。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

季節を選んでください(1:春, 2:夏, 3:秋, 4:冬): 2
気温を入力してください(℃): 32
Tシャツがおすすめです。

季節を選んでください(1:春, 2:夏, 3:秋, 4:冬): 4
気温を入力してください(℃): 3
厚手のコートが必要です。

3.複雑な if 文の応用例

3.1. 成績判定プログラム

サンプルプログラム5:合格・追試・不合格の判定

プロジェクト/ファイル名: Lesson22_5/main.c

#include <stdio.h>

int main(void) {
    int score;
    printf("試験の点数を入力してください: ");
    scanf("%d", &score);

    if (score >= 60) {
        printf("合格です。\n");
    } else if (score >= 40) {
        printf("追試です。\n");
    } else {
        printf("不合格です。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

試験の点数を入力してください: 75
合格です。

試験の点数を入力してください: 45
追試です。

試験の点数を入力してください: 30
不合格です。

まとめ

複雑な if 文は、実践的なプログラム作成において欠かせないスキルです。

  • 論理演算子(&&、||、!)を活用すれば、複数の条件を1つのif文でスマートに記述できます。
  • if文のネストを使えば、より細かく段階的な分岐が可能になります。
  • 実例で練習し、条件の組み立て方やプログラムの流れをしっかり理解しましょう。

これらのテクニックを身につけることで、現場で通用する柔軟なプログラムが書けるようになります。