C言語では、条件分岐を行う際に使用できる構文がいくつか存在します。
そのうちの1つが、switch-case文と呼ばれる構文です。
switch-case文は主に、条件ごとに分けたい処理が数多くある場合に使用されます。また、enumと呼ばれる型と組み合わせ使用されるケースもあり、様々な場面で活用することができる便利な機能です。
今回の記事では、この switch-case文について
- switch-case文とは
- switch-case文の基本構造、使い方
- default句の使い方
といった基本的な内容から、enumと合わせて使用する方法やループ文の中での挙動についてなど、応用的な内容についても解説していきたいと思います。
ぜひ、参考にしてみてください。
C言語のswitch文とは?
switch文 (switch-case文) は、条件分岐を行いたい際に使用される制御構文の1つです。
特定の値に対して条件を比較し、結果に応じて処理を振り分けることができます。
似た役割を持つ構文に if文がありますが、より多くの条件で処理を分岐させたい場合には、switch文の方が簡潔にコードに書くことが出来ます。
そのため、処理内容によって if文と switch文を使い分けるのが一般的です。
switch文の使い方
さっそく、switch文の使い方について見ていきましょう。
基本構文と使い方
まずは、基本的な構文から解説していきます。
swtich文を使用する際は、基本的に以下のような形式でコードを記述します。
【基本構文】
switch(式) {
case 値1:
// 式の結果が値1と一致したときの処理
break;
case 値2:
// 式の結果が値2と一致したときの処理
break;
default:
// どの値とも一致しなかったときの処理
}
主なポイントは、以下の3つとなっています。
- switch()の括弧内に比較元となる値を記述する
- 条件とする値と、その値に一致した場合の処理を 「case」 で分けて記述する
- 処理の終わりに break文を記述して、 switch文を抜けるようにする
特に重要なポイントは、それぞれの処理の終わりに 「break」 文を記述することです。
switch文は、式の結果に応じて該当するラベルまで実行順を飛ばす機能しか持たないため、処理が完了した後に swicth文を自動で抜け出すことがありません。
そのため、break文を使用して処理を抜け出さないと、一致する条件より後に記述されている処理も続けて実行されてしまいます。
ケースにより、あえて break文を入れずに処理を続ける方法もありますが、基本的には必ず各処理の終わりに記述するようにしましょう。
以下は、基本的な使い方についての簡単なサンプルコードです。
【サンプルコード】
#include <stdio.h>
int main(void) {
int num = 1;
switch(num) {
case 1:
printf("1と一致しました\n");
break;
case 2:
printf("2と一致しました\n");
break;
case 3:
printf("3と一致しました\n");
break;
default:
printf("numの値が不正です\n");
}
return 0;
}
【実行結果】
1と一致しました
もう1点、swtich文を使用する際の注意点として、各caseで指定する値には定数しか書くことができません。
計算式や変数名などは指定不可となっているため、指定の際には注意してください。
break文の使い方とswitch文のフォールスルー
先ほども解説したように、switch文では、break文の記述がない場合に一致した case以降のすべての処理が実行されます。この仕様のことを 「フォールスルー」 と言います。
以下のサンプルコードで、実際の動きを見てみましょう。
【サンプルコード】
#include <stdio.h>
int main(void) {
int num = 1;
switch(num) {
case 1:
printf("1と一致しました\n");
case 2:
printf("2と一致しました\n");
case 3:
printf("3と一致しました\n");
break;
case 4:
printf("4と一致しました\n");
break;
case 5:
printf("5と一致しました\n");
break;
default:
printf("1〜5以外の数値が入力されました\n");
}
return 0;
}
【実行結果】
1と一致しました
2と一致しました
3と一致しました
enumを使用して複数条件で分岐する
switch文は、enumとも相性がいい構文です。
enumとは、列挙体と呼ばれるデータ構造を扱うための型で、関連する定数を1つのグループとしてまとめることができる特徴を持っています。
列挙体の各定数には整数が割り振られ、文字列で定数名を付けて管理するため、定数の意図が把握しやすくなり、コードの可読性が向上するという利点があります。
既に上述したように、switch文では caseの値に変数名を指定することができませんが、enumであれば定数名をそのまま使用することができます。
以下のサンプルコードで確認してみましょう。
【サンプルコード】
#include <stdio.h>
enum week {
Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};
int main(void) {
// 列挙体のインスタンスを作成して初期化する
enum week todayWeek = Mon;
switch(todayWeek) {
case Mon:
case Tue:
case Wed:
case Thu:
case Fri:
printf("今日は平日です\n");
break;
case Sat:
case Sun:
printf("今日は休日です\n");
break;
default:
printf("何曜日か分かりませんでした\n");
}
return 0;
}
【実行結果】
今日は平日です
サンプルコードを見ると分かると思いますが、caseごとの値に列挙体 「week」 で宣言した定数名を使用することで、曜日を比較する処理であることが一目で理解できるようになっています。
これが、switch文と合わせて enumを活用するメリットの1つです。
また、余談ですが、上記のコードでは先ほど解説したフォールスルーも応用的に活用しています。
switch文で比較したい内容が、条件式に渡された曜日が平日と休日のどちらであるかなので、複数の曜日で処理結果が重なることになります。
そのため、あえて break文を記述しないことで、該当する曜日の処理を1つにまとめています。
ループの中でswitch文を使用したときの動作
switch文を使用する上ではほとんど必須とも言える break文ですが、ループ処理を中断して抜け出す際にも、同じく break文を使用します。
では、もしループ処理の中で switch文を使用して条件分岐を行った場合に、どのような挙動をするのでしょうか?
例えば、以下のようなコードの場合です。
【サンプルコード】
for(loopCount = 1; loopCount <= 3; loopCount++) {
switch(num) {
case 1:
// 処理内容
break;
case 2:
// 処理内容
break;
default:
// 処理内容
}
}
このような処理内容の場合に、break文がどこまで作用するのかを見ていきましょう。
break文と合わせて、ループ処理でよく使われる continue文の挙動も合わせて確認します。
break文を使用したときの動作
さっそく、以下のサンプルコードで、ループ処理の中で switch文を使った場合の挙動を確認してみましょう。
【サンプルコード】
#include <stdio.h>
int main(void) {
int loopCount;
printf("ループ処理を開始します\n");
for(loopCount = 1; loopCount <= 3; loopCount++) {
printf("%d回目のループ処理です\n", loopCount);
switch(loopCount) {
case 1:
printf("ループカウント数が1と一致しました\n");
break;
case 2:
printf("ループカウント数が2と一致しました\n");
break;
case 3:
printf("ループカウント数が3と一致しました\n");
break;
}
}
printf("ループ処理を終了しました\n");
return 0;
}
【実行結果】
ループ処理を開始します
1回目のループ処理です
ループカウント数が1と一致しました
2回目のループ処理です
ループカウント数が2と一致しました
3回目のループ処理です
ループカウント数が3と一致しました
ループ処理を終了しました
実行結果を見ると、最後までループ処理が行われ、中断されていないことが分かります。
このように、ループ処理内で switch文を使用した場合、break文の効果は switch文へのみ反映され、ループ文へ影響することはありません。
条件分岐によってループ処理を中断するか否かを振り分けたい場合は、switch文ではなく if文を使用するようにしましょう。
continue文を使用したときの動作
続いて、同じような状況下で continue文を使った場合の動きを見てみましょう。
【サンプルコード】
#include <stdio.h>
int main(void) {
int loopCount;
printf("ループ処理を開始します\n");
for(loopCount = 1; loopCount <= 3; loopCount++) {
printf("%d回目のループ処理です\n", loopCount);
switch(loopCount) {
case 1:
printf("ループカウント数が1と一致したので、continue文を使用します\n");
continue;
printf("continue文を使用しました。ループ処理をこのまま続けます\n");
break;
case 2:
printf("ループカウント数が2と一致しました\n");
break;
case 3:
printf("ループカウント数が3と一致しました\n");
break;
}
}
printf("ループ処理を終了しました\n");
return 0;
}
【実行結果】
ループ処理を開始します
1回目のループ処理です
ループカウント数が1と一致したので、continue文を使用します
2回目のループ処理です
ループカウント数が2と一致しました
3回目のループ処理です
ループカウント数が3と一致しました
ループ処理を終了しました
注目するべきポイントは、1回目のループ処理の結果です。
コード上では、変数 「loopCount」 が1と一致した場合の処理内でcontinue文の後にも文字列を表示するコードを記述していましたが、実際にはコンソールに表示されないまま次のループに処理が移行しています。
先ほどの break文とは異なり、switch文では continue を使用することが無いため、switch文の処理内に記述してもループ処理はスキップされます。
それぞれの挙動について混同したりすることがないよう、使用の際には注意しましょう。
まとめ
いかがでしたか?今回は、C言語でのswitch-case文の使い方について解説しました。
条件分岐処理は、いずれの言語でも必ず用意されている基本的かつ重要な機能です。
今回紹介した switch文と、同じく条件分岐を行うことができる if文のどちらも、実際の開発においてよく使用されています。
それぞれを適切な場面で使い分けることができるよう、if文と合わせて使い方をしっかりと覚えておくようにしましょう。
C言語の勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、C言語に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。