C言語のif文で複数条件を扱う方法|論理演算子&ネストの使い分け

目次

1. はじめに

C言語における条件分岐は、プログラムの流れを制御するための重要な要素です。その中でも if 文は、条件に応じて異なる処理を実行するための基本的な構造です。しかし、実際のプログラムでは「1つの条件だけでなく、複数の条件を組み合わせる」ことが必要になる場面が多くあります。

例えば、以下のような状況を考えてみましょう。

: 「変数 a が 10 以上で、かつ b が 5 未満なら処理を実行する」

このような場合、C言語では論理演算子(&&, ||)やネスト(ifの入れ子)を使って条件を組み合わせることができます。本記事では、C言語の if 文で複数の条件を扱う方法について、基本から応用まで詳しく解説します。

2. C言語のif文の基本

2.1. if文の基本構造

C言語における if 文は、指定した条件が真(true)である場合に、特定の処理を実行します。

if (条件) {
    // 条件が真のときの処理
}

例:変数 x が 10 以上ならメッセージを表示

#include <stdio.h>

int main() {
    int x = 15;

    if (x >= 10) {
        printf("xは10以上です。
");
    }

    return 0;
}

2.2. if-else文の基本構造

if 文に else を加えることで、条件が偽(false)の場合の処理を記述できます。

if (条件) {
    // 条件が真のときの処理
} else {
    // 条件が偽のときの処理
}

例:ユーザーの入力した数値が正の数かどうかを判定

#include <stdio.h>

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

    if (num > 0) {
        printf("入力された数は正の数です。
");
    } else {
        printf("入力された数は正の数ではありません。
");
    }

    return 0;
}

2.3. if-else if-else文の基本構造

複数の条件をチェックしたい場合は else if を使用します。

if (条件1) {
    // 条件1が真の場合の処理
} else if (条件2) {
    // 条件2が真の場合の処理
} else {
    // すべての条件が偽の場合の処理
}

例:入力された点数に応じて成績を表示

#include <stdio.h>

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

    if (score >= 80) {
        printf("成績: A
");
    } else if (score >= 60) {
        printf("成績: B
");
    } else {
        printf("成績: C
");
    }

    return 0;
}

3. if文で複数の条件を扱う方法

3.1. 論理演算子(&&, ||)の活用

C言語では、複数の条件を &&(AND演算子)や ||(OR演算子)を使って組み合わせることができます。

&&(AND演算子)

  • すべての条件が満たされた場合に実行される
#include <stdio.h>

int main() {
    int a = 15, b = 3;

    if (a > 10 && b < 5) {
        printf("aは10より大きく、bは5より小さいです。
");
    }

    return 0;
}

||(OR演算子)

  • どちらか一方の条件が満たされれば実行される
#include <stdio.h>

int main() {
    int a = 8, b = 3;

    if (a > 10 || b < 5) {
        printf("aが10より大きいか、bが5より小さいです。
");
    }

    return 0;
}

!(NOT演算子)

  • 条件を逆にする
#include <stdio.h>

int main() {
    int a = 8;

    if (!(a > 10)) {
        printf("aは10以下です。
");
    }

    return 0;
}

3.2. if文のネスト(入れ子)

  • if 文の中に if 文を入れることで、より細かい条件分岐が可能

例:年齢と身長の両方をチェック

#include <stdio.h>

int main() {
    int age = 20, height = 170;

    if (age >= 18) {
        if (height >= 160) {
            printf("成人であり、身長が160cm以上です。
");
        } else {
            printf("成人ですが、身長が160cm未満です。
");
        }
    } else {
        printf("未成年です。
");
    }

    return 0;
}

4. 複数条件を扱う際のベストプラクティス

4.1. 可読性の向上

4.1.1. 条件式を分割する

int isEligibleForDiscount = (score >= 80);
int isAdult = (age >= 18);
int isMemberValid = (isMember == 1);

if (isEligibleForDiscount && isAdult && isMemberValid) {
    printf("優待対象者です。
");
}

4.1.2. 条件式を関数化する

#include <stdio.h>

int isEligible(int score, int age, int isMember) {
    return (score >= 80 && age >= 18 && isMember == 1);
}

int main() {
    int score = 85, age = 20, isMember = 1;

    if (isEligible(score, age, isMember)) {
        printf("優待対象者です。
");
    } else {
        printf("優待対象者ではありません。
");
    }

    return 0;
}

4.2. パフォーマンスの考慮

4.2.1. 短絡評価(ショートサーキット)を活用する

if (a != 0 && b / a > 1) {
    printf("計算結果: %d
", b / a);
}

4.2.2. 評価順を最適化する

if (a > 0 && isHeavyCalculation()) {
    printf("処理を実行
");
}

4.3. メンテナンス性の向上

4.3.1. 条件式の分かりやすさを意識する

if (user.age >= 18 && user.score >= 50) {
    printf("条件を満たしています。
");
}

4.3.2. マジックナンバーを避ける

#define ADULT_AGE 18

if (age >= ADULT_AGE) {
    printf("成人です。
");
}

 

5. 実践例:if文を使ったプログラム

5.1. ユーザーの年齢に応じたメッセージを表示

#include <stdio.h>

int main() {
    int age;

    printf("年齢を入力してください: ");
    scanf("%d", &age);

    if (age >= 18 && age < 65) {
        printf("あなたは成人です。
");
    } else if (age >= 65) {
        printf("あなたはシニアです。
");
    } else {
        printf("あなたは未成年です。
");
    }

    return 0;
}

5.2. ログイン認証の簡易プログラム

#include <stdio.h>
#include <string.h>

int main() {
    char username[20];
    char password[20];

    printf("ユーザー名: ");
    scanf("%s", username);

    printf("パスワード: ");
    scanf("%s", password);

    if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
        printf("ログイン成功!
");
    } else {
        printf("ログイン失敗...
");
    }

    return 0;
}

5.3. 三角形の判定プログラム

#include <stdio.h>

int main() {
    int a, b, c;

    printf("三角形の3辺を入力してください: ");
    scanf("%d %d %d", &a, &b, &c);

    if (a == b && b == c) {
        printf("正三角形です。
");
    } else if (a == b || b == c || a == c) {
        printf("二等辺三角形です。
");
    } else {
        printf("不等辺三角形です。
");
    }

    return 0;
}

5.4. 数値の範囲チェック

#include <stdio.h>

int main() {
    int number;

    printf("数値を入力してください: ");
    scanf("%d", &number);

    if (number >= 50 && number <= 100) {
        printf("適切な数値です。
");
    } else {
        printf("範囲外です。
");
    }

    return 0;
}
侍エンジニア塾

6. FAQ(よくある質問)

6.1. if文とswitch文はどちらを使うべき?

if文を使うべき場面

  • 範囲(大小比較)が必要な場合
  • 複雑な論理式を用いる場合
if (score >= 90) {
    printf("成績: A
");
} else if (score >= 80) {
    printf("成績: B
");
} else {
    printf("成績: C
");
}

switch文を使うべき場面

  • 特定の値(整数や文字)を判定する場合
switch (grade) {
    case 'A':
        printf("優秀です。
");
        break;
    case 'B':
        printf("良い成績です。
");
        break;
    default:
        printf("無効な評価です。
");
}

6.2. if文のネストと論理演算子、どちらを使うべき?

ネストを使う場合

if (age >= 18) {
    if (hasID) {
        printf("入場できます。
");
    } else {
        printf("身分証明書が必要です。
");
    }
}

論理演算子を使う場合

if (age >= 18 && hasID) {
    printf("入場できます。
");
}

6.3. if文の条件をシンプルに書く方法

三項演算子を使う

int result = (a > 10) ? 1 : 0;

条件を関数化する

int isAdult(int age) {
    return age >= 18;
}

if (isAdult(age)) {
    printf("成人です。
");
}

6.4. if文の条件が間違って動作しない場合の原因

=(代入演算子)と ==(比較演算子)の間違い

if (x == 5) {
    printf("xは5です。
");
}

条件の優先順位を明示する

if ((a > 10 && b < 5) || c == 3) {
    printf("条件成立
");
}

浮動小数点の比較

#include <math.h>

if (fabs(a - b) < 0.0001) {
    printf("aとbはほぼ等しい。
");
}

7. まとめ

7.1. if文の基本構造

if (条件) {
    // 条件が真のときの処理
} else {
    // 条件が偽のときの処理
}

7.2. if文で複数の条件を扱う方法

論理演算子の活用

if (age >= 18 && hasID) {
    printf("入場できます。
");
}

ネストの活用

if (age >= 18) {
    if (hasID) {
        printf("入場できます。
");
    } else {
        printf("身分証が必要です。
");
    }
}

7.3. 可読性・パフォーマンスを考慮した書き方

条件を関数化

int isEligible(int score, int age) {
    return (score >= 80 && age >= 18);
}

if (isEligible(85, 20)) {
    printf("優待対象です。
");
}

短絡評価の活用

if (a != 0 && b / a > 1) {
    printf("計算結果: %d
", b / a);
}

7.4. 実践的な活用例

if (age >= 18 && age < 65) {
    printf("成人です。
");
}
if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
    printf("ログイン成功!
");
}
if (number >= 50 && number <= 100) {
    printf("適切な数値です。
");
}

7.5. よくある間違いとその対策

if (x == 5) {
    printf("xは5です。
");
}
if ((a > 10 && b < 5) || c == 3) {
    printf("条件成立
");
}
#include <math.h>

if (fabs(a - b) < 0.0001) {
    printf("aとbはほぼ等しい。
");
}

7.6. 本記事の総括

✅ C言語の if 文をマスターすることで、プログラムの制御がより柔軟になる!
✅ 複数条件の組み合わせには、論理演算子とネストを適切に使い分ける!
✅ 可読性とパフォーマンスを意識し、コードの最適化を図る!
✅ 実践的な例を通じて、エラーを防ぎながら正しく記述する!

7.7. これからの学習に向けて

今後、より高度な制御構造(switch 文、while ループなど)や関数の活用について学ぶことで、さらに柔軟なプログラムが作成できるようになります。
C言語のスキルを磨いて、より良いプログラミングを目指しましょう!