C++ で switch ステートメントを使用する
-
マルチケースコードパスのシナリオを構築するために
switch
文を使用する -
デフォルトのコードパスを
switch
の中で指定するにはdefault
キーワードを使用する -
異なるコードパスでローカル変数を宣言するために
{}
ブロック記法を使用する
この記事では、C++ での switch
文の使い方についていくつかの方法を説明します。
マルチケースコードパスのシナリオを構築するために switch
文を使用する
switch
キーワードは、与えられた式を条件として評価する他のブロックベースの文と同様に使用されます。唯一の違いは、式が case
キーワードで指定された各コードパスと比較して積分値を持たなければならないことです。パスは次のような構造になっています - case label : statements
ここで、label
は switch
条件で指定された式と比較される値です。式がラベルのいずれかにマッチした場合、プログラムの実行はそのラベルの後に続くステートメントに移る。case
ブロックが break;
文で終了しなかった場合、プログラムは break;
に到達しないか switch
スコープ自体が終了するまで、それに続くすべての case
ブロックの文を実行し続けることに注意してください。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
int main() {
int week_day;
cout << "Type the weekday (0-6): ";
cin >> week_day;
if (cin.fail()) {
cout << "Error occured when reading from stream!" << endl;
exit(EXIT_FAILURE);
};
switch (week_day) {
case Monday:
cout << "Monday\n";
break;
case Tuesday:
cout << "Tuesday\n";
break;
case Wednesday:
cout << "Wednesday\n";
break;
case Thursday:
cout << "Thursday\n";
break;
case Friday:
cout << "Friday\n";
break;
case Saturday:
cout << "Saturday\n";
break;
case Sunday:
cout << "Sunday\n";
break;
default:
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
デフォルトのコードパスを switch
の中で指定するには default
キーワードを使用する
default
キーワードは、宣言されたケースのどれもが switch
式にマッチしない場合に実行される特殊なケースのラベルを定義します。注意すべき重要な点は、すべてのラベルブロックは switch
構造体の基本的なロジックを満たすために最後に break;
文を必要とするということです。次のコードサンプルでは、switch
文をブレークなしで実行していますが、これはかなり突然の動作になることに注意してください。もし week_day
の値が最初のラベル Monday
と一致した場合、デフォルトラベルの横にあるものも含めて、すべての cout
文が実行されます。一方、week_day
の値が大文字小文字のラベルと一致しない場合は、default
のラベルで始まる cout
文が実行されます。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
int main() {
int week_day;
cout << "Type the weekday (0-6): ";
cin >> week_day;
if (cin.fail()) {
cout << "Error occured when reading from stream!" << endl;
exit(EXIT_FAILURE);
};
switch (week_day) {
case Monday:
cout << "Monday\n";
case Tuesday:
cout << "Tuesday\n";
case Wednesday:
cout << "Wednesday\n";
case Thursday:
cout << "Thursday\n";
case Friday:
cout << "Friday\n";
default:
cout << "Wrong number specified!\n";
case Saturday:
cout << "Saturday\n";
case Sunday:
cout << "Sunday\n";
}
exit(EXIT_SUCCESS);
}
異なるコードパスでローカル変数を宣言するために {}
ブロック記法を使用する
他のブロックベースのステートメントと同様に、switch
のボディは変数を宣言できるスコープを持っていますが、ケースでは各 case
構造体の中にローカル変数を持つ必要があります。すべての case
パスのステートメントは、{}
内の別のブロック内で宣言されていない限り、スコープを共有していることに注意してください。したがって、ある case
で変数が初期化された場合、他のケースのステートメントが同じ変数を参照することはできません。次の例は、switch
文を実装したもので、case Friday
のローカルブロックがあり、その中の変数は他の case
からは見えないようになっています。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
int main() {
int week_day;
cout << "Type the weekday (0-6): ";
cin >> week_day;
if (cin.fail()) {
cout << "Error occured when reading from stream!" << endl;
exit(EXIT_FAILURE);
};
switch (week_day) {
case Monday:
cout << "Monday\n";
break;
case Tuesday:
cout << "Tuesday\n";
break;
case Wednesday:
cout << "Wednesday\n";
break;
case Thursday:
cout << "Thursday\n";
break;
case Friday: {
string str = "Friday";
cout << str << endl;
break;
}
case Saturday:
cout << "Saturday\n";
break;
case Sunday:
cout << "Sunday\n";
break;
default:
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}