この章では、複数の選択肢から1つを選んで処理を分ける
switch
文と、C++における列挙型(enum class)について学びます。
#include <iostream>
using namespace std;
int main() {
int level;
cout << "レベル(1〜3)を入力:";
cin >> level;
switch (level) {
case 1:
cout << "初級です。" << endl;
break;
case 2:
cout << "中級です。" << endl;
break;
case 3:
cout << "上級です。" << endl;
break;
default:
cout << "範囲外です。" << endl;
break;
}
return 0;
}switch は数値や文字に基づいて処理を分ける構文break を忘れると次の case
に処理が流れる(フォールスルー)default はすべての case
に当てはまらないときに実行#include <iostream>
using namespace std;
enum Rank { Gold = 1, Silver, Bronze };
int main() {
Rank rank = Silver;
switch (rank) {
case Gold:
cout << "金賞" << endl;
break;
case Silver:
cout << "銀賞" << endl;
break;
case Bronze:
cout << "銅賞" << endl;
break;
default:
cout << "参加賞" << endl;
break;
}
return 0;
}enumでは、定数名がグローバルに展開される(他のenumと名前がかぶる危険がある)switch文などでそのまま使えるC++にはenum classという列挙型が用意されています。 enum class は、型の安全性と大規模開発でのミス防止を重視した設計です。 小規模コードでは煩雑に感じるかもしれませんが、チーム開発や複雑な設計で力を発揮します。
enum Rank { Gold = 1, Silver, Bronze };enum class Rank { Gold = 1, Silver, Bronze };Rank::Gold のようにスコープを明示enum class Rank
によって作られた「独自の型名」Rank::Silver
のように型名を明示する必要がある#include <iostream>
using namespace std;
enum class Rank { Gold = 1, Silver, Bronze };
int main() {
Rank rank = Rank::Silver;
switch (static_cast<int>(rank)) {
case 1:
cout << "金賞" << endl;
break;
case 2:
cout << "銀賞" << endl;
break;
case 3:
cout << "銅賞" << endl;
break;
default:
cout << "参加賞" << endl;
break;
}
return 0;
}enum class の値は switch
文でそのまま使うことはできませんcase Rank::Gold:
のような書き方もできません(整数定数である必要があるため)static_cast<int>(rank)
を使って明示的に整数に変換する必要がありますenum class は 暗黙の整数変換が禁止
されているswitch に渡すには int
に明示的に変換が必要static_cast<T>(値) はC++の安全な型変換方法次のコードの出力は?
#include <iostream>
using namespace std;
int main() {
int rank = 2;
switch (rank) {
case 1: cout << "金賞" << endl; break;
case 2: cout << "銀賞" << endl; break;
case 3: cout << "銅賞" << endl; break;
default: cout << "参加賞" << endl; break;
}
return 0;
}銀賞
rank == 2 により、case 2 が実行される1〜7の数値を受け取り、対応する曜日を表示するプログラムを作成しなさい。
// 06_day_of_week.cpp
#include <iostream>
using namespace std;
int main() {
int day;
cout << "曜日番号(1〜7)を入力:";
cin >> day;
switch (day) {
case 1: cout << "日曜日" << endl; break;
case 2: cout << "月曜日" << endl; break;
case 3: cout << "火曜日" << endl; break;
case 4: cout << "水曜日" << endl; break;
case 5: cout << "木曜日" << endl; break;
case 6: cout << "金曜日" << endl; break;
case 7: cout << "土曜日" << endl; break;
default: cout << "無効な番号です。" << endl; break;
}
return 0;
}switch 文は条件分岐をシンプルに記述できるbreak を忘れるとフォールスルーに注意enum class
を使うと名前の衝突を防ぎ、安全に定数を管理できるstatic_cast<int>() を使って switch
で列挙型を扱えるようにする