C言語学習ポータル(無料版) 学習コンテンツ 制御構造 switch文とfallthrough

🔀 制御構造

switch文とfallthrough

無料公開版に収録・読む目安 11分

🎯 switch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する

ラーメン屋の券売機を思い浮かべてください。「1番ならラーメン、2番ならチャーハン、3番なら餃子」。範囲ではなく、値がぴったり一致するかどうかで分かれます。こういうときはifを並べるよりswitch文のほうが読みやすくなります。

switch (式) {
    case 定数1:
        処理;
        break;
    case 定数2:
        処理;
        break;
    default:
        どれにも当てはまらなかったときの処理;
        break;
}

条件ではなく値で飛び先を選ぶのがポイントです。switch に置けるのは整数として扱える値だけ(int・char・列挙型など)で、文字列は使えません。また case x > 5: のような範囲指定も書けません。範囲で分けたいときは素直に else if を使います。

動く例です。

#include <stdio.h>

int main(void) {
    int menu = 2;

    switch (menu) {
        case 1:
            printf("ラーメン 800円\n");
            break;
        case 2:
            printf("チャーハン 750円\n");
            break;
        case 3:
            printf("餃子 400円\n");
            break;
        default:
            printf("その番号はありません\n");
            break;
    }
    return 0;
}

menu が 2 なので「チャーハン 750円」だけが表示されます。

さて、ここからが switch の本題です。case は部屋の入口ではなく、床に書かれたジャンプ先の目印にすぎません。だからbreakで止めないと、そのまま下の case へ歩いていってしまいます。これをフォールスルーと呼びます。

#include <stdio.h>

int main(void) {
    int menu = 1;

    switch (menu) {
        case 1:
            printf("ラーメン\n");    // break を忘れた
        case 2:
            printf("チャーハン\n");
            break;
    }
    return 0;
}

1番を選んだのに「ラーメン」と「チャーハン」の両方が出ます。case が5つ6つと並んだ状態で1つだけ break を落とすと、原因の特定にかなり手こずります。

師範case は部屋の入口ではない。床に書かれた目印じゃ。break という壁が無ければ、そのまま隣の部屋まで歩いていく

ただし、この性質はわざと使うこともあります。case を連続で並べると「まとめて同じ処理」が書けます。

#include <stdio.h>

int main(void) {
    int day = 7;   // 1=月 … 7=日

    switch (day) {
        case 6:
        case 7:
            printf("週末です\n");
            break;
        default:
            printf("平日です\n");
            break;
    }
    return 0;
}

case 6: には処理が何も書かれていないので、そのまま case 7: へ落ちて同じ処理を実行します。これは正しい、よくある書き方です。逆に言うと「処理を書いたのに break が無い」ものだけが疑わしい、と覚えておけば見分けられます。

最後の default は省略できますが、書いておくことを勧めます。想定外の値が来たときに気づけるからです。また default の中の break も文法上は不要ですが、あとから case を足したときの事故を防げます。

まとめます。switch は値がちょうど一致する多分岐。整数系の値にしか使えない。break を忘れると下へ流れ落ちる。case の連続だけは意図的なまとめ書き。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

switch文すいっちぶん

1つの値がどのケースに一致するかによって処理を振り分ける制御構造のこと。同じ変数に対する多分岐を、if-elseの連鎖より見やすく書ける。整数や文字など、値がぴったり一致するかどうかで振り分けが行われる。

break文ぶれいくぶん

ループやswitch文の実行をその場で強制的に抜け出す命令のこと。「これ以上繰り返す必要がない」と判断したときに使う。多重ループの中で使うと、いちばん内側のループだけを抜ける点に注意が必要。

フォールスルーふぉーるするー

switch文でbreakを書き忘れると、次のcaseの処理までそのまま実行され続けてしまう現象のこと。意図しないバグの定番原因として知られる。意図的に利用する場面もあるが、多くは書き忘れによる事故として発生する。

if文いふぶん

条件が真のときだけ、特定の処理を実行させる制御構造のこと。プログラムの中に「もしも」という分かれ道を作る、いちばん基本の道具。条件が偽のときは何もせず、そのまま次の処理へ進んでいく。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ 論理演算子と短絡評価 for文——回数が決まった繰り返し ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH