🇯🇵 日本語 | 🇺🇸 English
広告スペース

第15回 switch文

整数値で分岐する switch 文。case / break / default とフォールスルーを図解。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • switch (x) { case 1: ... break; default: ...; } の形
  • case の末尾に break; を忘れない
  • どの case にも該当しなければ default
⭐ 余裕があれば読む
  • フォールスルー(break省略)を意図的に使う
  • case には定数式のみ(変数不可)
  • switch で文字列は扱えない(整数型のみ)
💡 else if は第13回 if文に統合しました。3つ以上の分岐は else if を連鎖するだけなので、if の発展として扱います。このページでは値で分岐する新しい構文 switch を扱います。

switch文 ― 値によって分岐

ある変数の値ごとに処理を分けたいときに便利な構文。
int day = 3;
switch (day) {
  case 1: printf("月曜\n"); break;
  case 2: printf("火曜\n"); break;
  case 3: printf("水曜\n"); break;
  default: printf("不明\n");
}
switch(式)
分岐の元になる値を評価
case 値:
その値と等しいとき実行
break;
switchを抜ける (超重要)
default:
どれにも該当しないとき
switchはintやchar値で分岐できます。double値や文字列では使えません。

breakの重要性 ― フォールスルー

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 が全部出る!
🔴 break を忘れると何が起きるか ― 具体例で確認
例:日付 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");
}
出力(day=1):
月曜
火曜
水曜
不明

→ case 1 にマッチ後、break が無いので case 2, 3, default 全部に連続で「落ちて」実行されます。
コンパイル時点では何もエラーが出ないのが恐ろしいところ。実行して初めて「なぜか全部出る…」と気づきます。
🔴 case 1:case 1; と書いてしまったら?
コロン :セミコロン ; はキーボードで隣り合っているので打ち間違えが多い罠です。
switch(day){
  case 1; // ← ; にしてしまった!
    printf("月曜\n");
    break;
}
結果:コンパイルエラーになります(gcc の例):
error: expected ':' or '...' before ';' token
case 1 のあとに : が必要なところで ; が来てしまい、構文エラー。
→ 「ラベル」として機能しなくなるため、switch 文の構造が壊れます。
🔑 覚え方: case: は「ラベル」の印(goto 文のラベルと同じ書き方)。
文の終わりは ;、ラベルの区切りは : ― この2つを混同しないことが大切。
⚠️ もう一つの落とし穴:default:default;
同じく default もラベルなので : が必要。default; と書くとコンパイルは通ることがありますがどの値でも実行されない空文になり、全ケース外のときに何も起きないサイレントバグになります。
意図的にフォールスルーを使う場合: 「1または2なら同じ処理」といった共通処理を書くときは、あえて break を省きます。コメントで明示すると親切:
case 1: case 2: printf("小\n"); break; // 意図的

自分で書いてみよう ― switch

switch.c
出力
「実行」を押してください...
💡 こんなことも試してみよう
広告スペース

関連する講座

条件分岐編
第13回 条件分岐(if文)
C言語のif文の書き方。条件分岐をフローチャートで視覚的に理解。
繰り返し・配列・文字列
第16回 繰り返し(for/while)
C言語のfor文とwhile文の使い方。ループ処理を図解で解説。
条件分岐編
第14回 確認問題(if)
C言語のif文の理解度を確認するクイズ。
← 前の講座
第14回 確認問題(if)
次の講座 →
第16回 繰り返し(for/while)

確認クイズ

この講座の理解度をチェックしましょう!

Q1. switch 文で break を書かないとどうなる?

コンパイルエラー
次の case に処理が続く(フォールスルー)
何も起きない

break がないと、マッチした case 以降のすべての case が実行されます。これを「フォールスルー」と呼びます。

Q2. switch 文の default は必須?

必須
任意(省略可)
case が3つ以上のとき必須

default は省略可能ですが、どの case にも該当しない場合の処理を書けるため、通常は書くことが推奨されます。

Q3. switch 文の条件に使えない型は?

int
char
float

switch は整数型(int, char など)のみ対応しています。float や double は使えません。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。