導入
1つの変数の値によって多くの枝に分けるときは、switch 文がすっきり書けます。ただし C の switch には有名な落とし穴があります――break; を忘れると、下の case まで実行され続けてしまうのです。
説明
switch (変数) の中に case 値: を並べます。合った case から実行し、break; でその switch を抜けます。どれにも合わないときは default: が実行されます。
#include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("月曜\n");
break;
case 2:
printf("火曜\n");
break;
case 3:
printf("水曜\n");
break;
default:
printf("その他\n");
}
return 0;
}
ここで注意したいのが break; を忘れたときの動作です。switch は「合った case から下へそのまま流れ落ちる」仕組みなので、break; がないと次の case の処理まで続けて実行されてしまいます。これを「フォールスルー(fall-through)」と呼びます。次のコードで実際に確かめてみましょう。
#include <stdio.h>
int main() {
int day = 1;
switch (day) {
case 1:
printf("月曜\n");
// break を書き忘れた!
case 2:
printf("火曜\n");
break;
case 3:
printf("水曜\n");
break;
default:
printf("その他\n");
}
return 0;
}
day は 1 なのに、case 1 の break; がないため case 2 の printf まで実行され、「月曜」と「火曜」の両方が表示されてしまいます。これは書き忘れによる典型的なバグなので、switch を書くときは「各 case の最後に break; を書いたか」を必ず確認する習慣をつけましょう(意図的にフォールスルーさせたい場合を除きます)。
やってみよう
day の値を変えて、対応する曜日が表示されることを確かめましょう。上の「break を書き忘れた」コードも実行して、余分な行が表示されることを確認してください。
演習
int n = 2; について、switch で 1 なら 赤、2 なら 青、それ以外なら 不明 と表示してください(結果は 青)。それぞれの case に break; を忘れずに書いてください。
ヒント1を見る
case 1: case 2: を作り、それぞれ break;、最後に default:。