6日でできる 新C言語入門|if文のネスト

一段ずつ条件を確かめれば、複雑な分岐もこわくない。
if文のネストを理解して、細かな判断ができるC言語プログラムを書けるようになろう。

C言語で条件分岐を学び始めると、まずは if 文や if ~ else 文を使って、条件に応じて処理を切り替える書き方を覚えていきます。
ただ、実際のプログラムでは、1回の判定だけでは足りない場面がよくあります。

たとえば、最初に大きな条件を確認し、その条件を満たしていた場合だけ、さらに別の条件を調べたいことがあります。
このようなときに活躍するのが、if文のネストです。これは、if 文の中にさらに if 文を書く方法で、段階的に条件をチェックできるのが特徴です。

if文のネストを使うと、複数の条件を順番に確認できるので、細かな分岐を自然な形で表現できます。
一方で、入れ子が深くなりすぎると、コードが読みにくくなることもあります。そのため、仕組みを理解すると同時に、見やすく書く工夫も大切になります。

ここでは、if文のネストの基本的な考え方から、サンプルプログラムを使った動きの確認、実践的な使い方、読みやすく保つポイントまで、順番にわかりやすく解説していきます。

if文のネストとは何か

if文のネストとは、if 文の中にさらに if 文を書くことです。
日本語でいうと、ある条件が成り立つかを確認して、その条件が成り立っていた場合に、もう一度別の条件を確認するイメージです。

たとえば、次のような考え方です。

  • まず、会員かどうかを調べる
  • 会員だったら、さらに購入金額を調べる
  • その結果によって、送料や特典を変える

このように、1回目の判定結果を受けて、次の判定に進む構造が if文のネストです。

if文のネストの基本構文

基本の形は次のようになります。

if (条件式1) {
    if (条件式2) {
        条件式1と条件式2が成り立つときの処理
    } else {
        条件式1は成り立つが、条件式2は成り立たないときの処理
    }
} else {
    条件式1が成り立たないときの処理
}

この形を見ると、外側の if 文が最初の判定、内側の if 文が次の判定になっていることがわかります。

if文のネストは段階的な判定に向いている

if文のネストが便利なのは、条件をいきなり全部まとめるのではなく、段階的に判断できるところです。

たとえば、次のような場面で使いやすいです。

使いどころネストが向いている理由
会員かどうかを確認してから特典を決めるまず大きな分類をして、その中で細かく分けられる
季節を判定してから服装の提案を変える最初の条件ごとに次の判定内容を変えられる
点数が一定以上か確認してから評価を分ける段階的に評価を判定できる
エラーでない場合だけ追加チェックする不正値を除外してから次の処理に進める

つまり、if文のネストは、大きな条件の中でさらに詳しい条件を確認したいときにぴったりです。

図:if文のネストの基本的な流れ

この図から分かること

この図から分かるのは、if文のネストでは、最初の条件が成り立ったときだけ次の条件へ進む、という流れです。

つまり、いきなりすべての条件を同時に見るのではなく、まず大きな判定をして、その結果に応じて次の判定を行います。
この段階的な流れが、if文のネストの一番大事なポイントです。

最初のサンプルでネストの動きをつかもう

では、実際のプログラムで動きを見てみましょう。
ここでは、2つの整数を入力し、1つ目が正の数かどうかを確認したうえで、2つ目も正の数かどうかを調べるプログラムを使います。

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

#include <stdio.h>

int main(void) {
    int a, b;

    // 1つ目の整数を入力
    printf("1つ目の整数を入力してください: ");
    scanf("%d", &a);

    // 2つ目の整数を入力
    printf("2つ目の整数を入力してください: ");
    scanf("%d", &b);

    // まず1つ目の値を判定し、そのあとで2つ目を判定
    if (a > 0) {
        if (b > 0) {
            printf("両方とも正の数です。\n");
        } else {
            printf("1つ目は正の数ですが、2つ目は正の数ではありません。\n");
        }
    } else {
        printf("1つ目は正の数ではありません。\n");
    }

    return 0;
}

実行結果

1つ目の整数を入力してください: 6
2つ目の整数を入力してください: 9
両方とも正の数です。

1つ目の整数を入力してください: 6
2つ目の整数を入力してください: -2
1つ目は正の数ですが、2つ目は正の数ではありません。

1つ目の整数を入力してください: -4
2つ目の整数を入力してください: 8
1つ目は正の数ではありません。

Visual Studioで scanf を使う場合は、学習環境の設定によって SDLチェック を いいえ にして実行することがあります。
ここでは、ネストした if 文の流れに注目して見ていきましょう。

サンプル1の処理の流れを整理してみよう

このプログラムでは、まず a > 0 を調べています。
ここが最初の関門です。

  • a が正の数なら、内側の if 文へ進む
  • a が正の数でないなら、その時点で else の処理へ進む

そして、a が正の数だったときだけ、次に b > 0 を調べます。

この流れを表にすると、次のようになります。

判定内容表示されるメッセージ
aが正の数、bも正の数両方とも正の数です。
aが正の数、bは正の数ではない1つ目は正の数ですが、2つ目は正の数ではありません。
aが正の数ではない1つ目は正の数ではありません。

この表を見ると、b の判定は a が正の数だった場合だけ行われることがわかります。
これが、ネストの動きです。

なぜこの処理にネストが向いているのか

このプログラムでは、最初に 1つ目の値を見て、その条件を満たしていたら 2つ目を調べています。
この流れは、まさにネストに向いた考え方です。

もし 1つ目の値が正の数でなかったら、その時点で 2つ目の判定を細かくする必要がありません。
そのため、外側の if 文で大きく分け、その中で内側の if 文を使うと、考え方がそのままコードに表れます。

もう少し実践的なネストの例を見てみよう

次は、点数に応じて判定を分ける例です。
まず 50点以上かどうかを確認し、その条件を満たしていたら、さらに 80点以上かどうかを調べます。

こうすると、50点未満、50点以上80点未満、80点以上、という3段階の判定をネストで表現できます。

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

#include <stdio.h>

int main(void) {
    int score;

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

    // まず50点以上かを判定し、その中でさらに80点以上かを判定
    if (score >= 50) {
        if (score >= 80) {
            printf("とても良い成績です。\n");
        } else {
            printf("合格です。\n");
        }
    } else {
        printf("補習対象です。\n");
    }

    return 0;
}

実行結果

テストの点数を入力してください: 88
とても良い成績です。

テストの点数を入力してください: 67
合格です。

テストの点数を入力してください: 32
補習対象です。

サンプル2の判定の考え方

このプログラムでは、最初に score >= 50 を判定しています。

  • 50点以上なら、次に score >= 80 を判定
  • 50点未満なら、そのまま 補習対象です。 を表示

さらに、50点以上だった場合だけ、

  • 80点以上なら とても良い成績です。
  • 80点未満なら 合格です。

と表示します。

表にすると次のようになります。

score の範囲表示されるメッセージ
80以上とても良い成績です。
50以上80未満合格です。
50未満補習対象です。

この書き方のよいところは、点数の段階を上から下へ順番に確認しているのではなく、まず大きく 50点以上かどうかで分けて、その中でさらに細かく判定しているところです。

図:点数判定における if文のネスト

この図から分かること

この図から分かるのは、ネストした if 文では、外側の条件によって、内側の条件を調べるかどうかが決まるということです。

50点未満なら、80点以上かどうかを調べる必要はありません。
一方で、50点以上だった場合だけ、さらに 80点以上かどうかを見ればよいです。
このように、不要な判定を減らしながら条件を整理できるのが、ネストの便利なところです。

if文のネストと else if の違い

ここで少し気になるのが、if文のネストと else if の違いです。
どちらも複数の条件分岐に使えますが、考え方が少し違います。

書き方向いている場面
if文のネスト大きな条件の中で、さらに細かく判定したいとき
else if複数の条件を横並びで順番に判定したいとき

たとえば、点数を 80以上、50以上、それ以外 と分けるだけなら else if でも書けます。

if (score >= 80) {
    printf("とても良い成績です。\n");
} else if (score >= 50) {
    printf("合格です。\n");
} else {
    printf("補習対象です。\n");
}

この書き方も正しいです。
ただ、まず 50点以上かどうかを確認し、その条件を満たしている人の中でさらに 80点以上かどうかを見る、という考え方を表したいときには、ネストのほうが流れをつかみやすいことがあります。

ネストが深くなると読みにくくなることもある

if文のネストは便利ですが、何段も重ねると読みづらくなります。

たとえば、

  • if の中に if
  • さらにその中に if
  • さらにその中で else

という形が続くと、どの else がどの if に対応しているのか見失いやすくなります。

そのため、ネストを使うときは、次の点を意識すると読みやすくなります。

インデントをきちんとそろえる

コードの字下げが乱れていると、構造がとても分かりにくくなります。
ネストした部分は、内側に入るほど1段深く字下げするようにしましょう。

本当にネストが必要か考える

条件によっては、論理演算子を使ったほうがシンプルになる場合があります。

たとえば、両方とも正の数かどうかを知りたいだけなら、次のようにも書けます。

if (a > 0 && b > 0) {
    printf("両方とも正の数です。\n");
}

このように、条件を1行にまとめられるなら、そのほうが読みやすいこともあります。

else if で整理できるか考える

範囲ごとの判定なら、else if のほうが見やすいケースもあります。
ネストと else if は、目的に応じて使い分けることが大切です。

ネストと論理演算子の使い分け

どちらを使うべきか迷ったときは、条件の意味を日本語で考えると判断しやすいです。

ネストが向いている例

  • まず会員かどうかを見る
  • 会員なら、購入金額を見る
  • 非会員なら、別の基準で見る

このように、最初の条件によって次に調べる内容が変わるときは、ネストが向いています。

論理演算子が向いている例

  • a も b も両方とも正の数
  • x が 10以上で、y が 20未満
  • 会員で、なおかつ購入金額が3000円以上

このように、複数の条件を1つのまとまりとして同時に確認したいときは、論理演算子が向いています。

ネストした if 文を書くときの注意点

if文のネストでは、文法ミスよりも、考え方の整理不足で迷いやすいことがあります。
特に次の点は意識しておくと安心です。

注意点内容
どの条件を先に判定するか大きな分類から先に見ると整理しやすい
どの else がどの if に対応するかインデントと中括弧で明確にする
ネストしすぎていないか深すぎると読みにくくなる
論理演算子や else if のほうが適切ではないかより読みやすい書き方を選ぶ

プログラムが正しく動くだけでなく、後で自分が見返したときに理解しやすいこともとても大切です。

フローチャートで考えるとネストが理解しやすい

if文のネストは、コードだけで見るよりも、フローチャートで流れを確認すると理解しやすくなります。

外側の条件が1つ目の分岐で、その分岐の先に内側の条件がある、と考えると全体像がつかみやすいです。
特に、複数の分岐があるときは、図で整理してからコードにすると書きやすくなります。

図:if文のネストと整理の考え方

この図から分かること

この図から分かるのは、if文のネストは、コードの見た目と処理の流れが対応しているということです。
字下げされた内側の if は、外側の条件を通過したあとで実行される判定です。

また、ネストは便利ですが、深くしすぎると読みづらくなるため、インデントや条件の整理がとても大切だということも分かります。

if文のネストは実践的な分岐処理の土台になる

if文のネストを理解すると、単純な二択だけでなく、状況に応じて段階的に判断するプログラムが書けるようになります。

たとえば、次のような処理にも応用できます。

応用例ネストの考え方
ログイン後の権限判定ログイン済みか確認してから管理者か判定
商品購入時の特典判定会員かどうかを見てから購入金額を確認
学習システムの評価判定合格圏か確認してから成績ランクを分ける
入力チェック範囲内の値か確認してから詳細条件を判定

こうした処理は、実際のプログラムでもよく登場します。
そのため、if文のネストは基礎文法でありながら、とても実践的な技術です。

まずは、外側の条件、内側の条件、else の対応関係をしっかり意識しながら、短いプログラムで練習してみてください。
1段ずつ条件を確認する感覚がつかめると、複雑な分岐も落ち着いて読めるようになります。