本文へスキップ
BecomeCoder

C言語コース · 第3章 制御構文 · レッスン10

switch ― 値で分岐する

ブラウザで完結

導入

1つの変数の値によって多くの枝に分けるときは、switch 文がすっきり書けます。ただし C の switch には有名な落とし穴があります――break; を忘れると、下の case まで実行され続けてしまうのです。

説明

switch (変数) の中に case 値: を並べます。合った case から実行し、break; でその switch を抜けます。どれにも合わないときは default: が実行されます。

#include <stdio.h>

int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("月曜\n");
            break;
        case 2:
            printf("火曜\n");
            break;
        case 3:
            printf("水曜\n");
            break;
        default:
            printf("その他\n");
    }
    return 0;
}

ここで注意したいのが break; を忘れたときの動作です。switch は「合った case から下へそのまま流れ落ちる」仕組みなので、break; がないと次の case の処理まで続けて実行されてしまいます。これを「フォールスルー(fall-through)」と呼びます。次のコードで実際に確かめてみましょう。

#include <stdio.h>

int main() {
    int day = 1;
    switch (day) {
        case 1:
            printf("月曜\n");
            // break を書き忘れた!
        case 2:
            printf("火曜\n");
            break;
        case 3:
            printf("水曜\n");
            break;
        default:
            printf("その他\n");
    }
    return 0;
}

day1 なのに、case 1break; がないため case 2printf まで実行され、「月曜」と「火曜」の両方が表示されてしまいます。これは書き忘れによる典型的なバグなので、switch を書くときは「各 case の最後に break; を書いたか」を必ず確認する習慣をつけましょう(意図的にフォールスルーさせたい場合を除きます)。

やってみよう

day の値を変えて、対応する曜日が表示されることを確かめましょう。上の「break を書き忘れた」コードも実行して、余分な行が表示されることを確認してください。

演習

int n = 2; について、switch1 なら 2 なら 、それ以外なら 不明 と表示してください(結果は )。それぞれの casebreak; を忘れずに書いてください。

ヒント1を見る

case 1: case 2: を作り、それぞれ break;、最後に default:

実際に動かしてみよう

下のエディタにCを書いて「実行」を押すと、ブラウザ内のインタプリタで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(scanf を使う回は「標準入力」欄に値を入れてから実行します)。

C/C++ — ブラウザ内で実行

ブラウザ内でC/C++を動かす学習用インタプリタ(JSCPP)を読み込みます(入門向けのサブセットです)。
スクロールして表示された時点でも自動で読み込まれます。