6日でできる 新C言語入門|switch文

番号ごとの処理を、すっきり分けて読みやすくする。
switch文を理解して、複数の選択肢を扱うC言語プログラムを書けるようになろう。

C言語で条件分岐を書くとき、まず思い浮かぶのはif文です。if文は、値が大きいか小さいか、範囲に入っているか、複数の条件を満たしているかなど、さまざまな判定に使える便利な構文です。

一方で、変数の値が1ならこの処理、2ならこの処理、3ならこの処理というように、決まった値ごとに処理を切り替えたい場面もよくあります。このようなときに役立つのがswitch文です。

switch文は、1つの値をもとにして複数のcaseへ処理を分ける構文です。たとえば、メニュー番号、曜日番号、モード番号、選択肢番号など、値の一致によって処理を切り替える場合に向いています。

if文でも同じような処理を書くことはできます。しかし、値の候補が多くなると、if文では条件式が長くなり、全体の見通しが悪くなることがあります。switch文を使うと、caseごとに処理を整理できるため、選択肢が多い分岐でも読みやすく書けます。

ただし、switch文にはbreak、default、フォールスルーといった特徴があります。特にbreakを書き忘れると、次のcaseの処理まで続けて実行されることがあります。これは便利な使い方にもなりますが、意図しない動作の原因にもなるため、仕組みを正しく理解することが大切です。

この記事では、switch文の基本構造、caseとbreakの役割、defaultの使い方、if文との違い、フォールスルーの考え方、実践的なサンプルプログラムまで、C言語初心者にも分かりやすく解説していきます。

switch文は値の一致で処理を分ける構文

switch文は、判定する値がどのcaseに一致するかを調べ、そのcaseに書かれた処理を実行します。

基本の形は次のようになります。

switch (判定する式) {
case 値1:
    値1に一致したときの処理;
    break;
case 値2:
    値2に一致したときの処理;
    break;
default:
    どのcaseにも一致しなかったときの処理;
    break;
}

switchの丸かっこの中には、判定したい式や変数を書きます。たとえば、menuという変数に入力された番号が入っている場合、switch (menu)のように書きます。

caseには、判定したい値を書きます。menuの値が1ならcase 1、2ならcase 2の処理へ進みます。どのcaseにも一致しない場合は、defaultの処理が実行されます。

要素役割
switch値を判定して分岐を開始する
case一致する値ごとの処理を書く
breakそのcaseの処理を終えてswitch文を抜ける
defaultどのcaseにも一致しない場合の処理を書く
判定する式分岐の基準になる値や変数

switch文では、基本的に整数型の値や文字型の値など、値の一致を判定しやすいものを扱います。大小比較や範囲判定よりも、番号や文字などの候補を分ける場面に向いています。

図:switch文は値ごとに処理を分ける

この図から分かること

この図から分かるのは、switch文が1つの値をもとに、複数の処理へ分岐する構文だという点です。

menuの値が1ならcase 1、2ならcase 2、3ならcase 3の処理に進みます。どのcaseにも一致しなければdefaultに進みます。値の候補がはっきりしている分岐では、switch文を使うと構造を整理しやすくなります。

caseは一致した値の処理を書く場所

caseは、switch文の中で値ごとの処理を書くために使います。case 1なら、判定する値が1だったときの処理を書きます。

たとえば、次のようなイメージです。

switch (menu) {
case 1:
    printf("基本文法を選びました。\n");
    break;
case 2:
    printf("変数の学習を選びました。\n");
    break;
}

この場合、menuの値が1なら基本文法を選びました。と表示されます。menuの値が2なら変数の学習を選びました。と表示されます。

caseの値は、switchで判定する値と比較されます。値が一致したcaseから処理が始まります。

menuの値実行されるcase表示例
1case 1基本文法を選びました。
2case 2変数の学習を選びました。
3case 3があればそこへ進むcase 3の処理
それ以外defaultがあればそこへ進むその他の処理

caseの後ろにはコロンを書きます。セミコロンではない点に注意しましょう。

breakはswitch文から抜けるために使う

switch文でとても重要なのがbreakです。breakは、そのcaseの処理を終えたあと、switch文の外へ抜けるために使います。

case 1:
    printf("基本文法を選びました。\n");
    break;

このように書くと、case 1の処理を実行したあと、switch文全体を抜けます。

もしbreakを書かなかった場合、次のcaseの処理まで続けて実行されます。この動きはフォールスルーと呼ばれます。意図して使えば便利ですが、うっかりbreakを書き忘れると、予想外の処理が実行される原因になります。

breakの有無動き
breakがあるそのcaseの処理後にswitch文を抜ける
breakがない次のcaseの処理へ続けて進む
意図的にbreakを省略複数のcaseで同じ処理を共有できる
うっかりbreakを忘れる想定外の処理が実行される可能性がある

入門段階では、基本的に各caseの最後にbreakを書くと覚えておくと安心です。

defaultは想定外の値に対応するために使う

defaultは、どのcaseにも一致しなかった場合に実行される処理です。必須ではありませんが、書いておくと想定外の入力に対応しやすくなります。

たとえば、1から3までのメニュー番号を受け付けるプログラムで、9が入力された場合、case 1、case 2、case 3のどれにも一致しません。このようなときにdefaultがあると、正しい番号を入力してください。と案内できます。

default:
    printf("1~3の番号を入力してください。\n");
    break;

defaultを書くことで、入力ミスや範囲外の値にも対応できます。学習用のサンプルでも、実用的なプログラムでも、defaultを用意しておくと分岐の抜け漏れを減らせます。

switch文のサンプルプログラム

次に、switch文を使ったサンプルプログラムを見てみましょう。ここでは、入力された学習メニュー番号に応じて、表示するメッセージを切り替えます。

プロジェクト/ファイル名: Lesson24_1/main.c

#include <stdio.h>

int main(void) {
    int menu;

    // 学習メニュー番号を入力してもらう
    printf("学習メニューを選んでください(1:基本文法 2:変数 3:条件分岐 4:繰り返し):");
    scanf("%d", &menu);

    // 入力された番号に応じて処理を切り替える
    switch (menu) {
    case 1:
        printf("基本文法の学習を始めます。\n");
        break;
    case 2:
        printf("変数と代入の学習を始めます。\n");
        break;
    case 3:
        printf("条件分岐の学習を始めます。\n");
        break;
    case 4:
        printf("繰り返し処理の学習を始めます。\n");
        break;
    default:
        printf("1~4の範囲で入力してください。\n");
        break;
    }

    return 0;
}

実行結果

学習メニューを選んでください(1:基本文法 2:変数 3:条件分岐 4:繰り返し):3
条件分岐の学習を始めます。

学習メニューを選んでください(1:基本文法 2:変数 3:条件分岐 4:繰り返し):8
1~4の範囲で入力してください。

このプログラムでは、scanfで入力された整数をmenuに保存し、その値をswitch文で判定しています。

menuが1なら基本文法、2なら変数と代入、3なら条件分岐、4なら繰り返し処理のメッセージを表示します。1から4以外の番号が入力された場合は、defaultの処理が実行されます。

サンプルプログラムの処理の流れ

このプログラムの流れを順番に確認してみましょう。

入力を受け取る

scanf("%d", &menu);

scanfを使って、キーボードから入力された整数をmenuに保存しています。int型の変数に入力値を入れるため、変数名の前に&を付けます。

switch文で値を判定する

switch (menu) {

ここで、menuに入っている値を判定します。caseに書かれた値と一致するかどうかを確認します。

一致したcaseの処理を実行する

case 3:
    printf("条件分岐の学習を始めます。\n");
    break;

menuの値が3なら、このcaseの処理が実行されます。breakによってswitch文の外へ抜けます。

どのcaseにも一致しなければdefaultへ進む

default:
    printf("1~4の範囲で入力してください。\n");
    break;

menuが1から4以外の場合は、defaultの処理が実行されます。

図:学習メニュー番号をswitch文で分岐する流れ

この図から分かること

この図から分かるのは、switch文では入力された番号に応じて、対応するcaseへ処理が進むという点です。

menuが3ならcase 3の処理だけが実行されます。1から4以外の値ならdefaultへ進みます。メニュー番号のように、候補がはっきりしている値を分岐するときは、switch文を使うと処理の対応関係が見やすくなります。

if文との違い

switch文とif文はどちらも条件分岐に使います。ただし、得意な分岐の種類が違います。

構文得意な分岐
if文大小比較、範囲判定、複雑な条件
else if文複数の条件を上から順番に判定
switch文1つの値がどの候補と一致するかの判定

if文は、score >= 80のような大小比較や、score >= 0 && score <= 100のような範囲判定に向いています。

一方、switch文は、menuが1、2、3、4のどれか、というように値の一致を判定するときに向いています。

if文が向いている例

if (score >= 80) {
    printf("評価Aです。\n");
} else if (score >= 60) {
    printf("評価Bです。\n");
} else {
    printf("評価Cです。\n");
}

このように、点数の範囲で分ける処理はif文やelse if文が向いています。

switch文が向いている例

switch (menu) {
case 1:
    printf("基本文法です。\n");
    break;
case 2:
    printf("変数です。\n");
    break;
}

このように、値の一致で分ける処理はswitch文が向いています。

switch文で使える値

switch文では、整数型の値やchar型の値など、整数として扱える値をよく使います。

使いやすい値
int型の番号menu、day、mode
char型の文字A、B、Cなどの文字
整数の式number % 3など
定数case 1、case 2など

switch文は、文字列の比較にはそのまま使えません。たとえば、入力された文字列がstartかstopかで分けたい場合は、文字列比較用の関数を使う必要があります。

入門段階では、switch文は番号や文字による選択肢の分岐に使う、と考えると分かりやすいです。

フォールスルーとは

switch文では、caseの最後にbreakを書かない場合、次のcaseへ処理がそのまま続きます。この動きをフォールスルーと呼びます。

フォールスルーは、複数のcaseで同じ処理を行いたいときに便利です。

たとえば、1と2は基礎学習、3と4は応用学習のように、複数の番号を同じグループとして扱いたい場合に使えます。

ただし、フォールスルーはbreakの書き忘れでも発生します。そのため、意図して使う場合は、コード上で分かりやすく整理することが大切です。

フォールスルーを使ったサンプルプログラム

次のサンプルでは、入力された曜日番号に応じて、平日か週末かを表示します。月曜日から金曜日は同じメッセージ、土曜日と日曜日は別のメッセージを表示します。

プロジェクト/ファイル名: Lesson24_2/main.c

#include <stdio.h>

int main(void) {
    int day;

    // 曜日番号を入力してもらう
    printf("曜日を番号で入力してください(1:月 2:火 3:水 4:木 5:金 6:土 7:日):");
    scanf("%d", &day);

    // 曜日番号に応じて平日か週末かを判定する
    switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("平日です。学習や仕事を進めやすい日です。\n");
        break;
    case 6:
    case 7:
        printf("週末です。復習や休息の時間を取りやすい日です。\n");
        break;
    default:
        printf("1~7の範囲で入力してください。\n");
        break;
    }

    return 0;
}

実行結果

曜日を番号で入力してください(1:月 2:火 3:水 4:木 5:金 6:土 7:日):2
平日です。学習や仕事を進めやすい日です。

曜日を番号で入力してください(1:月 2:火 3:水 4:木 5:金 6:土 7:日):7
週末です。復習や休息の時間を取りやすい日です。

曜日を番号で入力してください(1:月 2:火 3:水 4:木 5:金 6:土 7:日):9
1~7の範囲で入力してください。

このプログラムでは、case 1からcase 5までに処理を書かず、case 5のところでまとめて平日です。と表示しています。

dayが1でも2でも3でも4でも5でも、最終的にcase 5の処理へ流れ込み、同じメッセージが表示されます。これがフォールスルーを利用した書き方です。

また、case 6とcase 7も同じようにまとめています。土曜日と日曜日はどちらも週末として扱うため、同じ処理にしています。

フォールスルーの動きを表で確認する

フォールスルーの流れを表で整理すると、次のようになります。

入力値進むcase表示される内容
1case 1からcase 5へ流れる平日です。
2case 2からcase 5へ流れる平日です。
5case 5平日です。
6case 6からcase 7へ流れる週末です。
7case 7週末です。
9default1~7の範囲で入力してください。

このように、breakがないcaseは次のcaseへ進みます。共通処理をまとめたいときには便利ですが、意図しないフォールスルーにならないように注意しましょう。

図:フォールスルーで複数のcaseをまとめる

この図から分かること

この図から分かるのは、フォールスルーではbreakが出てくるまで次のcaseへ処理が流れていくという点です。

case 1からcase 5までを続けて書くことで、1から5のどれが入力されても同じ平日です。という処理にまとめられます。便利な書き方ですが、breakの書き忘れでも同じ動きが起こるため、意図しているかどうかをはっきりさせることが大切です。

フォールスルーを使うときの注意点

フォールスルーは便利ですが、使い方には注意が必要です。

特に、各caseごとに別々の処理を行いたい場合は、breakの書き忘れに気をつけましょう。breakを書き忘れると、次のcaseの処理まで実行され、予想と違う出力になることがあります。

注意点内容
breakを書き忘れない予想外に次のcaseへ進むことがある
意図して使う場合は見やすく書くcaseを並べて共通処理へ流す
コメントを付けると分かりやすい共通処理としてまとめていることを示せる
defaultを用意する想定外の値に対応できる
複雑にしすぎない読みにくい場合はif文や別の整理方法を考える

入門段階では、基本的には各caseにbreakを書くと覚えておき、共通処理をまとめたい場合だけ意図してbreakを省略するとよいでしょう。

defaultは省略できるが書く習慣を付ける

defaultは文法上、必ず書かなければならないものではありません。しかし、実用的なプログラムでは、想定外の値に対応するためにdefaultを書くことをおすすめします。

たとえば、ユーザーが1から4の番号を入力するはずでも、誤って0や9を入力する可能性があります。そのときdefaultがあれば、入力範囲が違うことを知らせられます。

defaultがある場合defaultがない場合
想定外の値にメッセージを出せる何も実行されず、原因が分かりにくい
入力ミスに気づきやすいプログラムが無反応に見えることがある
分岐の抜け漏れを減らせる対応していない値を見落としやすい

特に、入力値を使うswitch文では、defaultを用意しておくと親切です。

switch文でよくある間違い

switch文では、いくつかのミスが起こりやすいです。最初のうちは、次のポイントを意識して確認しましょう。

よくある間違い内容
breakを書き忘れる次のcaseまで処理が流れてしまう
caseの後ろにセミコロンを書くcase 値: のようにコロンを使う
defaultを書かない想定外の値に対応しにくい
switchで範囲判定をしようとする大小比較はif文のほうが向いている
文字列を直接switchで判定しようとするswitch文は文字列比較にはそのまま使えない
caseの値を重複させる同じ値のcaseは書けない

switch文は、値の一致による分岐には便利ですが、どんな条件にも向いているわけではありません。範囲や複雑な条件はif文、値の候補による分岐はswitch文、と考えると使い分けやすくなります。

switch文を読みやすく書くコツ

switch文はcaseが増えると長くなりやすいです。読みやすく書くためには、インデントやcaseの並び方を整えることが大切です。

コツ内容
caseを見やすく並べる値の順番に並べると分かりやすい
各caseにbreakを書く基本形として習慣にする
defaultを最後に置く想定外の処理が分かりやすい
コメントを活用する共通処理やフォールスルーの意図を補足する
処理が長い場合は関数化を考えるcase内が長すぎると読みにくくなる

入門段階では、case、処理、breakを1つのまとまりとして見ると理解しやすいです。

case 1:
    処理;
    break;

この形を基本として覚えておくと、switch文の構造を読み取りやすくなります。

switch文はメニュー処理でよく使われる

switch文が特によく使われるのは、メニュー処理です。ユーザーに番号を選んでもらい、その番号に応じて処理を変えるような場面です。

使用場面
メニュー選択1なら登録、2なら表示、3なら終了
曜日判定1なら月曜日、2なら火曜日
モード切り替え1なら通常モード、2なら管理モード
入力コマンド処理文字や番号に応じて処理を選ぶ
学習メニュー番号ごとに学習内容を切り替える

選択肢がはっきりしている場合、switch文を使うと対応関係が見やすくなります。caseを見れば、どの値がどの処理に対応しているかが分かるためです。

switch文を使うと分岐処理が整理しやすくなる

switch文は、値の一致によって処理を切り替えたいときに便利な構文です。caseごとに処理を整理できるため、複数の選択肢があるプログラムでも読みやすく書けます。

特に、メニュー番号、曜日番号、モード番号のように、決まった候補の中から1つを選ぶ処理では、switch文がよく使われます。

一方で、switch文にはbreakの書き忘れやフォールスルーといった注意点もあります。基本的には各caseの最後にbreakを書くこと、想定外の値に備えてdefaultを書くことを意識しましょう。

switch文の構造を理解すると、C言語で複数の選択肢を扱うプログラムが書きやすくなります。if文とswitch文の違いを押さえながら、場面に応じて使い分けていきましょう。