🔀 制御構造
🎯 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 は上から順、最初に真になった1本だけ。範囲判定は厳しい順に並べる。else は「想定外」の受け皿として置いておく。
if文の条件が偽だったときに実行する処理を書くための構文のこと。「そうでなければ」という日本語の意味にそのまま対応している。elseの後には条件を書かず、if以外のすべての場合を受け止める役割を持つ。
真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。