18 switch 文

変数の値が特定の整数に一致するかどうかで分岐する switch 文を学ぶ。
多くの分岐を書くとき、if-else if の連鎖より見通しがよくなる。


18-1 switch 文の基本構文

switch (式) {
    case 値1:
        /* 式が値1と等しいときの処理 */
        break;
    case 値2:
        /* 式が値2と等しいときの処理 */
        break;
    default:
        /* どの case にも一致しないときの処理 */
}
キーワード意味
case 値:式の値と一致したときの処理の開始点
break;switch ブロックを抜ける。忘れると次の case に流れる(フォールスルー)
default:どの case にも一致しなかったときに実行される。省略可能
⚠ switch の式は 整数型(int, char)のみ使える。
実数(double)や文字列は使えない。

18-2 実行例:基本の switch 文

18_01_switch_basic.c
#include <stdio.h>

int main(void)
{
    int n = 2;
    switch (n) {
        case 1:
            printf("A\n");
            break;
        case 2:
            printf("B\n");
            break;
        case 3:
            printf("C\n");
            break;
        default:
            printf("D\n");
    }
    return 0;
}
B

n = 2 なので case 2: に一致し「B」が出力される。
break により switch を抜け、case 3 や default は実行されない。


18-3 フォールスルー(break を忘れた場合)

break を書かないと、一致した case 以降の処理が連続して実行される

18_02_fallthrough.c
#include <stdio.h>

int main(void)
{
    int n = 1;
    switch (n) {
        case 1:
            printf("A\n");
            /* break を書かない */
        case 2:
            printf("B\n");
        default:
            printf("D\n");
    }
    return 0;
}
A
B
D
⚠ フォールスルーは意図しないバグの原因になりやすい。
意図的に使う場合はコメントで明示する。基本は毎 case に break を書くこと。

18-4 switch 文と if 文の使い分け

switch 文if 文
得意な比較整数値との完全一致範囲・複合条件
使える型int, char のみ制限なし
分岐が多いとき見通しがよいelse if が長くなる
範囲比較(>=など)できないできる
✅ 「値が1なら○○、2なら○○」のような特定の値への分岐は switch 文が読みやすい。
「70点以上なら合格」のような範囲比較は if 文を使う。

18-5 演習

📝 演習① 曜日を表示するプログラム

0〜6 の整数を入力し、対応する曜日名を英語で表示するプログラムを作れ。
0〜6 以外の入力には「Invalid input」と表示する。

入力出力
0Sunday
1Monday
2Tuesday
3Wednesday
4Thursday
5Friday
6Saturday
その他Invalid input
18_03_dayOfWeek.c
#include <stdio.h>

int main(void)
{
    int n;
    printf("0〜6の整数を入力してください: ");
    scanf("%d", &n);

    switch (n) {
        /* ここに case を書く */
    }

    return 0;
}
答えの例を表示
#include <stdio.h>

int main(void)
{
    int n;
    printf("0〜6の整数を入力してください: ");
    scanf("%d", &n);

    switch (n) {
        case 0: printf("Sunday\n");    break;
        case 1: printf("Monday\n");    break;
        case 2: printf("Tuesday\n");   break;
        case 3: printf("Wednesday\n"); break;
        case 4: printf("Thursday\n");  break;
        case 5: printf("Friday\n");    break;
        case 6: printf("Saturday\n");  break;
        default: printf("Invalid input\n");
    }

    return 0;
}
📝 演習② 簡易電卓(四則演算)

2つの整数と演算子(+, -, *, /)を入力し、計算結果を表示するプログラムを作れ。
/ のとき b が 0 なら「0で割れません」と表示する。

18_04_calculator.c
#include <stdio.h>

int main(void)
{
    int a, b;
    char op;

    printf("計算式を入力してください(例: 10 + 3): ");
    scanf("%d %c %d", &a, &op, &b);

    switch (op) {
        /* ここに case を書く */
    }

    return 0;
}
答えの例を表示
#include <stdio.h>

int main(void)
{
    int a, b;
    char op;

    printf("計算式を入力してください(例: 10 + 3): ");
    scanf("%d %c %d", &a, &op, &b);

    switch (op) {
        case '+': printf("%d\n", a + b); break;
        case '-': printf("%d\n", a - b); break;
        case '*': printf("%d\n", a * b); break;
        case '/':
            if (b != 0) {
                printf("%d\n", a / b);
            } else {
                printf("0で割れません\n");
            }
            break;
        default:
            printf("無効な演算子です\n");
    }

    return 0;
}

18-6 理解度チェック

Q1. 次のプログラムの出力として正しいものはどれか。

int a = 3;
switch (a) {
    case 1: printf("X\n"); break;
    case 2: printf("Y\n"); break;
    case 3: printf("Z\n"); break;
    default: printf("W\n");
}
解説を表示

正解:ウ

a = 3 なので case 3 に一致 → 「Z」を出力。break で終了。

Q2. 次のプログラムの出力として正しいものはどれか(フォールスルーに注意)。

int x = 2;
switch (x + 1) {
    case 1: printf("A\n");
    case 2: printf("B\n");
    case 3: printf("C\n");
    default: printf("D\n");
}
解説を表示

正解:イ

x + 1 = 3 なので case 3 に一致 → 「C」出力。
break がないためフォールスルーで default へ → 「D」出力。

Q3. switch 文で使えない式として正しいものはどれか。

解説を表示

正解:ウ

switch 文の式は整数型(int, char など)のみ使用可能。double などの浮動小数点型は使えない。

Q4. switch 文と比べた if 文の利点として正しいものはどれか。

解説を表示

正解:イ

if 文は範囲比較(score >= 70)や &&・|| を使った複合条件に対応できる。
switch 文は整数値との完全一致のみ。