C言語基礎|switch文による分岐処理

これまで学習してきた if 文は、
条件の判定結果によって 処理を2方向(真/偽)に分ける 文でした。

一方で、
「値によって処理を3通り、4通りに分けたい」
という場面も、実際のプログラムではよくあります。

そのようなときに活躍するのが switch 文 です。
switch 文を使うと、1つの式の値に基づいて、複数の分岐をすっきり表現できます。

if文で書いた分岐の例

まずは、if 文で書いたプログラムを確認しましょう。
次のプログラムは、入力された数値を 4で割った剰余 によって、
表示するメッセージを切り替えるものです。

if文による分岐

プロジェクト名:chap3-13-1 ソースファイル名:chap3-13-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 数値を4で割った剰余を表示(if文)
#include <stdio.h>

int main(void)
{
    int value;

    printf("数値を入力してください:");
    scanf("%d", &value);

    if (value % 4 == 0)
        puts("4で割り切れます。");
    else if (value % 4 == 1)
        puts("4で割った余りは1です。");
    else if (value % 4 == 2)
        puts("4で割った余りは2です。");
    else
        puts("4で割った余りは3です。");

    return 0;
}

この書き方の問題点

問題点内容
同じ計算の繰り返しvalue % 4 を何度も計算している。
修正ミスの原因条件式を書き換えるときに漏れが出やすい。
可読性分岐が増えるほど読みにくくなる。

1つの値を基準に分岐する場合は、
if 文よりも switch 文のほうが向いています。

switch文の基本構造

switch 文は、次のような構造を持っています。

switch (制御式) {
case 定数1:
    文;
    break;
case 定数2:
    文;
    break;
default:
    文;
}
要素役割
制御式評価される値(整数型)
case値ごとの分岐先(ラベル)
breakswitch 文から抜ける。
defaultどの case にも一致しない場合

※ 制御式の型は 整数型(intなど) でなければなりません。

switch文を使った書き直し

先ほどの if 文のプログラムを、
switch 文を使って書き直してみましょう。

switch文による分岐

プロジェクト名:chap3-13-2 ソースファイル名:chap3-13-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 数値を4で割った剰余を表示(switch文)
#include <stdio.h>

int main(void)
{
    int value;

    printf("数値を入力してください:");
    scanf("%d", &value);

    switch (value % 4) {
    case 0:
        puts("4で割り切れます。");
        break;
    case 1:
        puts("4で割った余りは1です。");
        break;
    case 2:
        puts("4で割った余りは2です。");
        break;
    case 3:
        puts("4で割った余りは3です。");
        break;
    }

    return 0;
}

改善されたポイント

項目内容
計算回数value % 4 は1回だけ
可読性分岐の対応関係が一目で分かる。
修正メッセージ変更が簡単

caseラベルとは何か

switch 文では、case の後ろに書かれた値
プログラムの飛び先を示す ラベル になります。

case 2:
    puts("4で割った余りは2です。");

この case 2 は、

  • 制御式の値が 2 のとき
  • この位置から処理を開始する

という意味を持ちます。

ラベルのルール

ルール内容
定数のみ変数は使えない。
重複不可同じ値の case は書けない。
書式case と値の間には空白が必要

break文の役割

case に到達すると、
その位置から 下方向に処理が続行されます。

そこで重要になるのが break 文 です。

break;

break文の働き

項目内容
役割switch 文を即座に終了
効果次の case へ落ちない
日本語「抜け出す」「中断する」

break がない場合、
次の case の処理まで実行されてしまう点には注意が必要です。

switch文が向いている場面

状況推奨
単一の整数値で分岐switch文
条件が範囲判定if文
複雑な条件式if文
メニュー選択switch文

重要ポイントまとめ

  • switch 文は 1つの値で多分岐するための文
  • 制御式は 整数型
  • case は 定数ラベル
  • break を忘れると意図しない動作になる。

次のステップとしては、
👉 break を省略したときの挙動
👉 default の使いどころ
👉 switch文で起こりやすいミス

を学ぶと、理解が一段深まりますよ。