
C言語基礎|switch文の応用
これまでに学習してきた switch 文は、
「1つの整数値に基づいて処理を切り替える」
という、とても分かりやすい分岐構造を持っていました。
しかし switch 文は、
単純な case 分岐だけでなく、break をあえて使わない構造 や
複数の case をまとめる書き方 など、
少し踏み込んだ使い方をすると、より柔軟な表現が可能になります。
ここでは、少し複雑な switch 文の動作を通して、
switch 文を安全に、かつ読みやすく使うための考え方 を身につけていきましょう。

breakを省略したswitch文の動作
まずは、switch 文の動作を確認するためのサンプルプログラムを見てみます。
ここでは、入力された数値によって 異なるメッセージが順に表示される ようになっています。
サンプルプログラム(動作確認用)
プロジェクト名:chap3-14-1 ソースファイル名:chap3-14-1.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
// switch文の応用的な動作を確認するプログラム
#include <stdio.h>
int main(void)
{
int code;
printf("数値を入力してください:");
scanf("%d", &code);
switch (code) {
case 1:
puts("Start");
puts("Ready");
break;
case 2:
puts("Loading");
case 5:
puts("Processing");
break;
case 6:
case 7:
puts("Completed");
break;
default:
puts("Unknown");
break;
}
return 0;
}実行結果の例
| 入力値 | 表示結果 |
|---|---|
| 1 | Start → Ready |
| 2 | Loading → Processing |
| 5 | Processing |
| 6 | Completed |
| 7 | Completed |
| その他 | Unknown |
fall through(処理の落下)
このプログラムで重要なのは、break が書かれていない case の存在です。
case 2:
puts("Loading");
case 5:
puts("Processing");
break;ここでは case 2 に break がないため、
- case 2 にジャンプ
- Loading を表示
- そのまま次の case 5 の処理へ進む
という流れになります。
このように、
break がない場合に次の case へ処理が流れること を
fall through(フォールスルー)と呼びます。
処理の流れ
| 状態 | 処理 |
|---|---|
| case 2 に一致 | Loading を表示 |
| break がない | 次の case へ |
| case 5 | Processing を表示 |
| break 実行 | switch 文終了 |
fall through は便利な場面もありますが、
意図せず発生するとバグの原因 になりやすいため、
明確な目的を持って使うことが重要です。
複数のcaseをまとめる書き方
次に注目したいのが、次の部分です。
case 6:
case 7:
puts("Completed");
break;この書き方では、
- code が 6 のとき
- code が 7 のとき
の どちらでも同じ処理 が実行されます。
この書き方のメリット
| 項目 | 内容 |
|---|---|
| 重複削減 | 同じ処理を何度も書かなくてよい。 |
| 可読性 | 同じ意味の値をまとめられる。 |
| 修正 | 処理変更が1か所で済む。 |
メニュー番号や状態コードのように、
意味が同じ値が複数ある場合 に、とても有効な書き方です。
defaultラベルの役割
switch 文の最後に書かれている default は、
default:
puts("Unknown");
break;制御式の値が どの case にも一致しなかった場合 に実行されます。
defaultを置く理由
| 理由 | 内容 |
|---|---|
| 想定外対策 | 入力ミスや異常値への対応 |
| 安全性 | 何も起きない状態を防ぐ。 |
| 可読性 | 分岐の網羅性が明確になる。 |
switch 文を書くときは、
default を置く習慣 をつけておくと安心です。
caseの順序とbreakの重要性
switch 文では、
case の並び順 や break の有無 によって、
実行結果が大きく変わります。
そのため、
- case の追加・削除
- 処理内容の変更
が発生しやすいプログラムでは、
すべての case の末尾に break を置く 書き方が安全です。
実務でのおすすめルール
| ルール | 理由 |
|---|---|
| 最後の case にも break | 変更に強くなる。 |
| fall through は明示的に | 読み手の誤解を防ぐ。 |
| default を必ず書く | 想定外を防止 |
switch文とif文の使い分け
switch 文と if 文は、どちらも 選択文 に分類されます。
| 観点 | if文 | switch文 |
|---|---|---|
| 判定対象 | 複雑な条件式 | 単一の整数値 |
| 範囲判定 | 得意 | 不向き |
| 可読性 | 条件次第 | 高い |
| 拡張性 | 条件増加で複雑 | case追加で対応 |
1つの整数値を基準に分岐する場合 は、
switch 文の方が読みやすく、ミスも減らせます。
選択文としてのswitch文
if 文と switch 文は、
どちらもプログラムの流れを選択的に分岐させる文です。
このような文をまとめて
選択文(selection statement) と呼びます。
状況に応じて適切な選択文を使い分けることが、
読みやすく、保守しやすいプログラムへの第一歩です。
演習問題
演習3-9
整数を読み込み、その値が奇数か偶数かを switch 文で判定せよ。
解答例
プロジェクト名:chap3-14-2 ソースファイル名:chap3-14-2.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
#include <stdio.h>
int main(void)
{
int n;
printf("整数を入力せよ:");
scanf("%d", &n);
switch (n % 2) {
case 0:
puts("その数は偶数です。");
break;
case 1:
puts("その数は奇数です。");
break;
}
return 0;
}演習3-10
月を読み込み、季節を switch 文で表示せよ。
解答例
プロジェクト名:chap3-14-3 ソースファイル名:chap3-14-3.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
#include <stdio.h>
int main(void)
{
int month;
printf("何月ですか:");
scanf("%d", &month);
switch (month) {
case 3:
case 4:
case 5:
puts("春です。");
break;
case 6:
case 7:
case 8:
puts("夏です。");
break;
case 9:
case 10:
case 11:
puts("秋です。");
break;
case 12:
case 1:
case 2:
puts("冬です。");
break;
default:
puts("その月はありません。");
break;
}
return 0;
}