C言語学習ポータル(無料版) 学習コンテンツ 制御構造 else if / else の分かれ道設計

🔀 制御構造

else if / else の分かれ道設計

無料公開版に収録・読む目安 11分

🎯 else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる

天気予報を見て服を決めます。「雨なら傘、曇りなら折りたたみ、それ以外なら帽子」。道は2本ではなく3本です。分かれ道が3本以上になったらelse ifの出番です。

if (条件A) {
    Aが真のときの処理
} else if (条件B) {
    Aが偽で、Bが真のときの処理
} else {
    どれも真でなかったときの処理
}

動きの要点はひとつだけ。上から順に確かめ、最初に真になった枝だけを実行して、残りは見ずに抜ける。これさえ押さえれば else if で迷うことはありません。

成績判定で試しましょう。

#include <stdio.h>

int main(void) {
    int score = 72;

    if (score >= 90) {
        printf("評価 A\n");
    } else if (score >= 80) {
        printf("評価 B\n");
    } else if (score >= 70) {
        printf("評価 C\n");
    } else {
        printf("評価 D\n");
    }
    return 0;
}

72点は >= 90 が偽、>= 80 も偽、>= 70 が真なので「評価 C」。ここで判定は打ち切られ、else へは行きません。

ここで、else if と「if をただ並べたもの」の違いも押さえておきましょう。if (A) { … } if (B) { … } と書くと A と B は別々に判定されるので、両方が真なら両方とも実行されます。else if でつなぐと「どれか1つだけ」になります。1つだけ選びたいのか、当てはまるものを全部実行したいのか——書く前に決めておくと、条件が増えたときに迷いません。

さて、この形には有名な落とし穴があります。順番を逆にすると、全部が最初の条件に吸い込まれます。

#include <stdio.h>

int main(void) {
    int score = 95;

    if (score >= 70) {
        printf("評価 C\n");        // 95点でもここに入ってしまう
    } else if (score >= 80) {
        printf("評価 B\n");        // ここへは永遠に来ない
    } else if (score >= 90) {
        printf("評価 A\n");        // ここも同じ
    }
    return 0;
}

95点なのに「評価 C」。else if は「上の条件がすべて偽のとき」しか評価されないので、ゆるい条件を先頭に置くと、下の枝が全部死にます。しかもコンパイルは通り、エラーも警告も出ません。範囲で分けるときは、狭い(厳しい)条件から順に並べる。これが鉄則です。

もうひとつ、最後の else を省くかどうかの話。省いても文法上は問題ありませんが、「どれにも当てはまらない値」が無言で素通りしていきます。想定外の入力ほど、あとで痛い目を見ます。とりあえず else を書いて「ここには来ないはず」というメッセージを出しておくと、来たときにすぐ気づけます。

師範else if の並びは、ふるいの目の粗さじゃ。細かいふるいから順にかけよ。粗いふるいを先に置けば、何も残らぬ

まとめます。else if は上から順、最初に真になった1本だけ。範囲判定は厳しい順に並べる。else は「想定外」の受け皿として置いておく。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

if文いふぶん

条件が真のときだけ、特定の処理を実行させる制御構造のこと。プログラムの中に「もしも」という分かれ道を作る、いちばん基本の道具。条件が偽のときは何もせず、そのまま次の処理へ進んでいく。

elseえるす

if文の条件が偽だったときに実行する処理を書くための構文のこと。「そうでなければ」という日本語の意味にそのまま対応している。elseの後には条件を書かず、if以外のすべての場合を受け止める役割を持つ。

条件式じょうけんしき

真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ if文——もしも、の分かれ道 条件式の罠——= と == の悲劇 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH