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 文の本当の動きは、次のようになっています。

  1. 条件値を評価する。
  2. 一致する case ラベルまでジャンプする。
  3. そこから先は、上から順に実行する。
  4. break に出会ったら switch 文を抜ける。

つまり、break がない限り処理は止まらない のです💡

重要ポイント

項目説明
case条件ではなく「ラベル」
breakswitch 文を抜ける命令
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」
を基本ルールにしておくのが安心です😊

慣れてきたら、
フォールスルーを「道具」として使いこなせるようになりましょう✨