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;
}

実行結果の例

入力値表示結果
1Start → Ready
2Loading → Processing
5Processing
6Completed
7Completed
その他Unknown

fall through(処理の落下)

このプログラムで重要なのは、break が書かれていない case の存在です。

case 2:
    puts("Loading");
case 5:
    puts("Processing");
    break;

ここでは case 2 に break がないため、

  1. case 2 にジャンプ
  2. Loading を表示
  3. そのまま次の case 5 の処理へ進む

という流れになります。

このように、
break がない場合に次の case へ処理が流れること
fall through(フォールスルー)と呼びます。

処理の流れ

状態処理
case 2 に一致Loading を表示
break がない次の case へ
case 5Processing を表示
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;
}