
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 | 表示例 |
|---|---|---|
| 1 | case 1 | 基本文法を選びました。 |
| 2 | case 2 | 変数の学習を選びました。 |
| 3 | case 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 | 表示される内容 |
|---|---|---|
| 1 | case 1からcase 5へ流れる | 平日です。 |
| 2 | case 2からcase 5へ流れる | 平日です。 |
| 5 | case 5 | 平日です。 |
| 6 | case 6からcase 7へ流れる | 週末です。 |
| 7 | case 7 | 週末です。 |
| 9 | default | 1~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文の違いを押さえながら、場面に応じて使い分けていきましょう。
