switch文
1つの値に基づいて複数の処理を分岐させる
概要
switch文は、 1つの値に対して複数の値と比較して処理を分ける機能です。
if-else if を多く連ねるよりも、 読みやすいコードになることがあります。
switch文の基本形
switch (値) {
case 値1:
// 値が値1の場合ここが実行
break;
case 値2:
// 値が値2の場合ここが実行
break;
default:
// どの値にも合致しない場合
break;
}
簡単な例
#include <iostream>
int main() {
int day = 1;
switch (day) {
case 1:
std::cout << "月曜日" << std::endl;
break;
case 2:
std::cout << "火曜日" << std::endl;
break;
case 3:
std::cout << "水曜日" << std::endl;
break;
default:
std::cout << "その他の曜日" << std::endl;
break;
}
return 0;
}
実行結果:
月曜日
day が 1 にマッチするので、 case 1 のブロックが実行されます。
switch文の重要なポイント: break文
break文は、 switch文をすぐに抜けるための文です。
break がないと、マッチしたケースから後続のすべてのケースが実行されます。 これをフォールスルーと呼びます。
break なしの例(悪い例)
#include <iostream>
int main() {
int day = 1;
switch (day) {
case 1:
std::cout << "月曜日" << std::endl;
// break がない!
case 2:
std::cout << "火曜日" << std::endl;
case 3:
std::cout << "水曜日" << std::endl;
break;
default:
std::cout << "その他" << std::endl;
}
return 0;
}
実行結果:
月曜日
火曜日
水曜日
break がないため、 case 1 以降すべてが実行されました。 通常、これは望ましくありません。
break ありの例(正しい例)
switch (day) {
case 1:
std::cout << "月曜日" << std::endl;
break; // ここで抜ける
case 2:
std::cout << "火曜日" << std::endl;
break;
default:
std::cout << "その他" << std::endl;
}
フォールスルーが役立つケース
通常は break を忘れてはいけませんが、 意図的にフォールスルーを使う場合もあります。
例: 複数の値に同じ処理
int day = 2; // 2 = 火曜日
switch (day) {
case 1: // 月
case 2: // 火
case 3: // 水
case 4: // 木
case 5: // 金
std::cout << "平日です" << std::endl;
break;
case 6: // 土
case 7: // 日
std::cout << "休日です" << std::endl;
break;
}
実行結果:
平日です
switch vs if-else
同じ変数と複数の値を比較するなら switch を使う
比較のほうが読みやすい場合が多いです。
| 状況 | 推奨 | 理由 |
|---|---|---|
| 1つの変数と複数の値を比較 | switch | 読みやすい、効率良い |
| 複雑な条件(<, >,論理演算子等) | if-else | 複雑な判定はswitch では難しい |
例: if-else で書く場合
int day = 1;
if (day == 1) {
std::cout << "月曜日" << std::endl;
} else if (day == 2) {
std::cout << "火曜日" << std::endl;
} else if (day == 3) {
std::cout << "水曜日" << std::endl;
} else {
std::cout << "その他" << std::endl;
}
このコードは switch で書く方が短く、読みやすい。
switch文で使える値の型
switch 文では、以下の型が使用できます:
- int(整数)— 最も一般的
- char(文字)
- string(文字列)— C++11以降
char を使った例
#include <iostream>
int main() {
char grade = 'B';
switch (grade) {
case 'A':
std::cout << "優秀" << std::endl;
break;
case 'B':
std::cout << "良好" << std::endl;
break;
case 'C':
std::cout << "可" << std::endl;
break;
default:
std::cout << "評価外" << std::endl;
}
return 0;
}
良好
ポイント
- switch文は1つの値と複数の値を比較
- break文で switch を抜ける(忘れやすい!)
- defaultはどれにも合致しないときの処理
- 複合条件は if-else を使う
よくある誤り
誤り1: break を忘れる
case 1:
std::cout << "1" << std::endl;
// break; を忘れた!→ 次のケースも実行
誤り2: switch内で変数宣言
switch (x) {
case 1:
int y = 10; // NG: スコープの問題
break;
case 2:
// y は使えない
}
// OK: break ありのブロックで。
switch (x) {
case 1: {
int y = 10;
break;
}
}
誤り3: 範囲での比較
switch (age) {
case 0 to 17: // NG: これはできない
std::cout << "未成年" << std::endl;
break;
}
// OK: if-else を使う
if (age >= 0 && age <= 17) {
std::cout << "未成年" << std::endl;
}
やってみよう
練習1: 月の番号(1〜12)を入力させ、その月の日数を出力。
練習2: ユーザーから計算機の操作を受け付ける(+, -, *, /)。
チャレンジ: 選択メニュー(1: 足す、2: 引く、3: 掛ける、4: 割る)を作成。
ヒント
switch文で選択肢ごとに処理を分ける。
まとめ
- switch文で1つの値と複数の値を比較
- breakを忘れずに書く
- defaultですべてに合致しないケースを処理
- 複雑な条件は if-else が適切