整数値で分岐する switch 文。case / break / default とフォールスルーを図解。
switch (x) { case 1: ... break; default: ...; } の形case の末尾に break; を忘れないcase にも該当しなければ defaultbreak省略)を意図的に使うcase には定数式のみ(変数不可)else if を連鎖するだけなので、if の発展として扱います。このページでは値で分岐する新しい構文 switch を扱います。
int day = 3; switch (day) { case 1: printf("月曜\n"); break; case 2: printf("火曜\n"); break; case 3: printf("水曜\n"); break; default: printf("不明\n"); }
break; を書かないと、次のcaseに「落ちて」実行し続けます(フォールスルー)。バグの温床!switch (n) { case 1: printf("A\n"); // breakなし! case 2: printf("B\n"); // breakなし! case 3: printf("C\n"); break; } // n=1 のとき: A, B, C が全部出る!
day が 1〜3 のとき曜日を出すつもりが、break を全部書き忘れたケース:
int day = 1; switch(day){ case 1: printf("月曜\n"); // break無し case 2: printf("火曜\n"); // break無し case 3: printf("水曜\n"); // break無し default: printf("不明\n"); }
月曜
火曜
水曜
不明case 1: を case 1; と書いてしまったら?: と セミコロン ; はキーボードで隣り合っているので打ち間違えが多い罠です。
switch(day){ case 1; // ← ; にしてしまった! printf("月曜\n"); break; }
error: expected ':' or '...' before ';' tokencase 1 のあとに : が必要なところで ; が来てしまい、構文エラー。case の : は「ラベル」の印(goto 文のラベルと同じ書き方)。;、ラベルの区切りは : ― この2つを混同しないことが大切。
default: を default;default もラベルなので : が必要。default; と書くとコンパイルは通ることがありますがどの値でも実行されない空文になり、全ケース外のときに何も起きないサイレントバグになります。
break を省きます。コメントで明示すると親切:case 1: case 2: printf("小\n"); break; // 意図的
default を書いて全ての case にマッチしない場合を処理break を外してフォールスルーを観察case で文字定数 ('a') を使うcase 1: case 2:)この講座の理解度をチェックしましょう!
break がないと、マッチした case 以降のすべての case が実行されます。これを「フォールスルー」と呼びます。
default は省略可能ですが、どの case にも該当しない場合の処理を書けるため、通常は書くことが推奨されます。
switch は整数型(int, char など)のみ対応しています。float や double は使えません。