10 if 文

ここまでは「上から順に実行される」プログラムを書いてきた。
この章では条件によって処理を分岐させる方法を学ぶ。

✅ プログラムの基本構造は3つ:順次(上から順に)・選択(条件分岐)・繰り返し
これまでは順次だけを使っていた。if文で選択が加わる。

10-1 if 文の基本構文

if (条件式) {
    /* 条件が真(0以外)のときに実行される処理 */
}

条件式が 0 以外なら真(ブロック内を実行)、0 なら偽(スキップ)。
比較・論理演算子は 09章で学んだ内容をそのまま使う。

10_01_if_basic.c
#include <stdio.h>

int main(void)
{
    int score;

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

    if (score >= 70) {
        printf("合格です¥n");
    }

    printf("プログラム終了¥n");
    return 0;
}

実行例(85 を入力した場合):

点数を入力してください: 85
合格です
プログラム終了

実行例(60 を入力した場合):

点数を入力してください: 60
プログラム終了
インデント(字下げ)は必ず入れること。
C言語はインデントがなくても動くが、どの処理が if の中にあるか一目でわかるようにするための重要な約束ごと。

10-2 波かっこの省略と落とし穴

if ブロック内の文が1つだけなら {} を省略できる。
しかし省略すると次の落とし穴にはまりやすい

/* 意図:x が正のときだけ両方の printf を実行したい */
if (x > 0)
    printf("正の数¥n");
    printf("処理終了¥n");   /* ← {} がないのでここは常に実行される */

2つ目の printf はインデントされているように見えても、if の外にある。
x が 0 以下でも「処理終了」は常に表示される。

✅ 初心者のうちは1文でも必ず {} を書く習慣を身につけよう。
後から文を追加したときのバグを防げる。

10-3 else(条件が偽のとき)

if (条件式) {
    /* 真のときの処理 */
} else {
    /* 偽のときの処理 */
}
10_02_if_else.c
#include <stdio.h>

int main(void)
{
    int score;

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

    if (score >= 70) {
        printf("合格¥n");
    } else {
        printf("不合格¥n");
    }

    return 0;
}
点数を入力してください: 65
不合格

10-4 else if(複数条件)

3つ以上に分岐したいときは else if を使う。
条件は上から順に評価され、最初に真になった1つだけが実行される

if (条件式1) {
    /* 条件1が真のとき */
} else if (条件式2) {
    /* 条件1が偽で条件2が真のとき */
} else {
    /* 全部偽のとき */
}
10_03_elseif.c
#include <stdio.h>

int main(void)
{
    int score;

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

    if (score >= 90) {
        printf("A評価¥n");
    } else if (score >= 70) {
        printf("B評価¥n");
    } else if (score >= 50) {
        printf("C評価¥n");
    } else {
        printf("D評価¥n");
    }

    return 0;
}
点数を入力してください: 75
B評価
⚠ 条件の順番が重要。score >= 50 を最初に書くと 90点でも「C評価」になる。
範囲が重なる条件は狭い方(大きい値)から先に書く

10-5 複合条件(&&・||)

09章で学んだ論理演算子を条件式に組み合わせて使う。

10_04_compound.c
#include <stdio.h>

int main(void)
{
    int age, height;

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

    if (age >= 12 && height >= 140) {
        printf("乗車可能です¥n");
    } else {
        printf("乗車できません¥n");
    }

    return 0;
}
年齢を入力してください: 14
身長(cm)を入力してください: 135
乗車できません

10-6 if 文のネスト(入れ子)

if 文の中に if 文を書くことができる。これをネスト(入れ子)と呼ぶ。

10_05_nested.c
#include <stdio.h>

int main(void)
{
    int score;

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

    if (score >= 0 && score <= 100) {   /* まず範囲チェック */
        if (score >= 70) {
            printf("合格¥n");
        } else {
            printf("不合格¥n");
        }
    } else {
        printf("無効な点数です¥n");
    }

    return 0;
}
⚠ ネストが深くなりすぎるとコードが読みにくくなる。
3段以上のネストは設計を見直すサインと考えよう。

10-7 演習

📝 演習① 年齢区分の判定

年齢を入力して区分を表示するプログラムを作れ。

10_06_ageGroup.c
#include <stdio.h>

int main(void)
{
    int age;

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

    /* ここに if 文を書く */

    return 0;
}
答えの例を表示
#include <stdio.h>

int main(void)
{
    int age;

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

    if (age <= 12) {
        printf("子ども¥n");
    } else if (age <= 19) {
        printf("未成年¥n");
    } else {
        printf("大人¥n");
    }

    return 0;
}
📝 演習② 0〜100 の範囲チェック

整数を入力し、0〜100 の範囲にあるか判定するプログラムを作れ。

10_07_rangeCheck.c
#include <stdio.h>

int main(void)
{
    int x;

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

    /* ここに if 文を書く */

    return 0;
}
ヒントを表示

範囲外の条件:x < 0 || x > 100

答えの例を表示
#include <stdio.h>

int main(void)
{
    int x;

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

    if (x < 0 || x > 100) {
        printf("無効な値です¥n");
    } else {
        printf("入力値は %d です¥n", x);
    }

    return 0;
}
📝 演習③ BMI 判定

身長(cm)と体重(kg)を入力して BMI を計算し、判定結果を表示するプログラムを作れ。
BMI = 体重(kg) ÷ (身長(m) × 身長(m))

10_08_bmi.c
#include <stdio.h>

int main(void)
{
    double height_cm, weight, bmi;

    printf("身長(cm)を入力してください: ");
    scanf("%lf", &height_cm);
    printf("体重(kg)を入力してください: ");
    scanf("%lf", &weight);

    /* ここに BMI 計算と if 文を書く */

    return 0;
}
ヒントを表示

cm を m に変換する:height_m = height_cm / 100.0;(height_m は先頭で宣言)
BMI の計算:bmi = weight / (height_m * height_m);

答えの例を表示
#include <stdio.h>

int main(void)
{
    double height_cm, weight, bmi, height_m;

    printf("身長(cm)を入力してください: ");
    scanf("%lf", &height_cm);
    printf("体重(kg)を入力してください: ");
    scanf("%lf", &weight);

    height_m = height_cm / 100.0;
    bmi = weight / (height_m * height_m);

    printf("BMI = %.1f¥n", bmi);

    if (bmi < 18.5) {
        printf("低体重¥n");
    } else if (bmi < 25.0) {
        printf("普通体重¥n");
    } else {
        printf("過体重¥n");
    }

    return 0;
}

10-8 理解度チェック

Q1. 次のコードで score = 65 のとき、出力されるものはどれか。

if (score >= 90) {
    printf("A¥n");
} else if (score >= 70) {
    printf("B¥n");
} else {
    printf("C¥n");
}
解説を表示

正解:ウ

65 は 90 未満・70 未満なので最後の else ブロックが実行される。

Q2. 次のコードで x = -1 のとき「処理終了」は出力されるか。

if (x > 0)
    printf("正の数¥n");
    printf("処理終了¥n");
解説を表示

正解:イ

{} がないため if が管理するのは直後の1文だけ。
2つ目の printfif の外にあり、条件に関係なく常に実行される。

Q3. else if の条件評価について正しいものはどれか。

解説を表示

正解:イ

上から順に評価し、最初に真になった時点でそのブロックを実行し、残りはスキップする。

Q4. 次のコードで age = 15height = 145 のとき出力されるものはどれか。

if (age >= 12 && height >= 140) {
    printf("乗車可能¥n");
} else {
    printf("乗車不可¥n");
}
解説を表示

正解:ア

age >= 12(15 ≥ 12:真)かつ height >= 140(145 ≥ 140:真)なので AND 条件が成立する。


10-9 まとめ

構文使いどころ
if (条件) { }条件が真のときだけ実行したい処理がある
if ~ else { }真と偽で別々の処理をしたい
if ~ else if ~ else3つ以上に分岐したい
&& / || の組み合わせ複数条件を一度に判定したい
{} は必ず書く省略によるバグを防ぐ