🔀 制御構造
🎯 switch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する
ラーメン屋の券売機を思い浮かべてください。「1番ならラーメン、2番ならチャーハン、3番なら餃子」。範囲ではなく、値がぴったり一致するかどうかで分かれます。こういうときはifを並べるよりswitch文のほうが読みやすくなります。
switch (式) {
case 定数1:
処理;
break;
case 定数2:
処理;
break;
default:
どれにも当てはまらなかったときの処理;
break;
}条件ではなく値で飛び先を選ぶのがポイントです。switch に置けるのは整数として扱える値だけ(int・char・列挙型など)で、文字列は使えません。また case x > 5: のような範囲指定も書けません。範囲で分けたいときは素直に else if を使います。
動く例です。
#include <stdio.h>
int main(void) {
int menu = 2;
switch (menu) {
case 1:
printf("ラーメン 800円\n");
break;
case 2:
printf("チャーハン 750円\n");
break;
case 3:
printf("餃子 400円\n");
break;
default:
printf("その番号はありません\n");
break;
}
return 0;
}menu が 2 なので「チャーハン 750円」だけが表示されます。
さて、ここからが switch の本題です。case は部屋の入口ではなく、床に書かれたジャンプ先の目印にすぎません。だからbreakで止めないと、そのまま下の case へ歩いていってしまいます。これをフォールスルーと呼びます。
#include <stdio.h>
int main(void) {
int menu = 1;
switch (menu) {
case 1:
printf("ラーメン\n"); // break を忘れた
case 2:
printf("チャーハン\n");
break;
}
return 0;
}1番を選んだのに「ラーメン」と「チャーハン」の両方が出ます。case が5つ6つと並んだ状態で1つだけ break を落とすと、原因の特定にかなり手こずります。
ただし、この性質はわざと使うこともあります。case を連続で並べると「まとめて同じ処理」が書けます。
#include <stdio.h>
int main(void) {
int day = 7; // 1=月 … 7=日
switch (day) {
case 6:
case 7:
printf("週末です\n");
break;
default:
printf("平日です\n");
break;
}
return 0;
}case 6: には処理が何も書かれていないので、そのまま case 7: へ落ちて同じ処理を実行します。これは正しい、よくある書き方です。逆に言うと「処理を書いたのに break が無い」ものだけが疑わしい、と覚えておけば見分けられます。
最後の default は省略できますが、書いておくことを勧めます。想定外の値が来たときに気づけるからです。また default の中の break も文法上は不要ですが、あとから case を足したときの事故を防げます。
まとめます。switch は値がちょうど一致する多分岐。整数系の値にしか使えない。break を忘れると下へ流れ落ちる。case の連続だけは意図的なまとめ書き。
1つの値がどのケースに一致するかによって処理を振り分ける制御構造のこと。同じ変数に対する多分岐を、if-elseの連鎖より見やすく書ける。整数や文字など、値がぴったり一致するかどうかで振り分けが行われる。
ループやswitch文の実行をその場で強制的に抜け出す命令のこと。「これ以上繰り返す必要がない」と判断したときに使う。多重ループの中で使うと、いちばん内側のループだけを抜ける点に注意が必要。
switch文でbreakを書き忘れると、次のcaseの処理までそのまま実行され続けてしまう現象のこと。意図しないバグの定番原因として知られる。意図的に利用する場面もあるが、多くは書き忘れによる事故として発生する。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。