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);
}
