
C言語入門|switch文の落とし穴:break忘れとフォールスルーの正しい理解
「switch 文って便利だけど、
なんだか挙動が不思議なことがあるんだよなぁ…🤔」
そんな違和感を覚えたことがある人、
それ、とても大事な感覚です👍
switch 文には、
初心者が必ず一度はハマる“落とし穴” があります。
それが、break 文の書き忘れ です😱
この章では、
- break 文を忘れると何が起きるのか
- switch 文の本当の動き方
- あえて break を書かない「フォールスルー」というテクニック
を、順番にやさしく解説していきます😊

break を忘れるとどうなる?😨
まずは、ありがちなミスの例を見てみましょう。
サンプルプログラム(あえて break を忘れた例)
プロジェクト名:5-3-1 ソースファイル名: sample5-3-1.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
printf("今日の気分を表示します\n");
srand((unsigned)time(NULL));
int mood = rand() % 3 + 1; // 1〜3 の乱数
switch (mood) {
case 1:
printf("とても元気!\n");
// break を書き忘れている
case 2:
printf("まあまあ元気\n");
break;
case 3:
printf("ちょっと疲れ気味\n");
break;
}
return 0;
}たとえば、mood に 1 が入った場合の実行結果は👇
今日の気分を表示します
とても元気!
まあまあ元気「えっ!?😳
“とても元気” だけ表示されるんじゃないの?」
と思いますよね。
switch 文の正体を知ろう🔍
実は switch 文は、
「条件に合った case だけを実行する文」
ではありません。
switch 文の本当の動きは、次のようになっています。
- 条件値を評価する。
- 一致する case ラベルまでジャンプする。
- そこから先は、上から順に実行する。
- break に出会ったら switch 文を抜ける。
つまり、break がない限り処理は止まらない のです💡
重要ポイント
| 項目 | 説明 |
|---|---|
| case | 条件ではなく「ラベル」 |
| break | switch 文を抜ける命令 |
| break なし | 次の case も続けて実行される |
「case は if みたいな条件分岐」
と思っていると、ここで必ず混乱します😅
順次実行されているだけだった!🧠
先ほどの例を、流れで見てみましょう。
- mood が 1
- case 1: にジャンプ
- printf("とても元気!") を実行
- break がない
- そのまま次の行へ進む
- case 2: の中身も実行
つまり、
switch 文の中では、順次実行が基本
ということなんですね😊
「だったら break を必須にしてくれればいいのに…」😩
そう思う人、多いです。
でも実はこの性質、わざと使う場面 もあるんです✨
それが、フォールスルー(fall through) です。
フォールスルーを活用した書き方✨
フォールスルーとは、
break を書かずに、次の case の処理も実行させること
を指します。
サンプルプログラム(フォールスルーの例)
プロジェクト名:5-3-2 ソースファイル名: sample5-3-2.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
printf("通知レベルを表示します\n");
srand((unsigned)time(NULL));
int level = rand() % 5 + 1; // 1〜5
switch (level) {
case 1:
case 2:
printf("重要なお知らせがあります\n");
break;
case 3:
printf("通常のお知らせです\n");
break;
case 4:
case 5:
printf("軽いお知らせです\n");
break;
}
return 0;
}このコードでは、
| level | 表示内容 |
|---|---|
| 1, 2 | 重要なお知らせがあります |
| 3 | 通常のお知らせです |
| 4, 5 | 軽いお知らせです |
という分岐を、
スッキリ1つの switch 文で表現 しています😊
なぜこれが成立するの?🤔
理由はシンプルです。
- case 1: に break がない
- そのまま case 2: に処理が流れる
- 共通の処理をまとめて書ける
このように、
同じ処理をする case をまとめたいとき
フォールスルーはとても便利です✨
フォールスルーは「意図」を明確に⚠️
ただし、フォールスルーは
break の書き忘れと見分けがつきにくい
という欠点があります。
そこで大切なのが、コメントです😊
case 1:
/* FALLTHROUGH */
case 2:
printf("重要なお知らせがあります\n");
break;このように、
- 自分のため
- チームメンバーのため
「これはわざとだよ!」
と伝えるコメントを必ず入れましょう👍
まとめ:switch 文の安全な使い方🌱
最後に、大事なポイントを整理します。
| ポイント | 内容 |
|---|---|
| break 忘れ | ほぼ確実にバグの原因 |
| case はラベル | 条件分岐ではない |
| フォールスルー | 意図的なら有効なテクニック |
| コメント | 意図を明確にするため必須 |
初心者のうちは、
「case の最後には必ず break」
を基本ルールにしておくのが安心です😊
慣れてきたら、
フォールスルーを「道具」として使いこなせるようになりましょう✨
