C++ での switch ステートメント
-
C++ の
switch-case
ステートメント -
C++ で
Switch Case
を使用する際のルールとプロパティ -
C++ での
switch
ステートメントとif-else
ステートメントの違い
この記事では、C++ の switch
ステートメントとその特別なプロパティについて学習します。
C++ の switch-case
ステートメント
switch-case
は、その値に基づいて式を評価し、case
ステートメントに存在する定数値のリストに対してテストされ、さまざまな cases
に基づいてさまざまなアクションを実行します。
if-else
と同様に、switch ステートメントは制御フローステートメントです。これは、式または変数が多方向分岐
を介してフローを制御できるため、プログラムの一般的なフローを変更できるためです。
構文:
switch(variable / expression)
{
case constant-expression 1:
statements;
case constant-expression 2:
statements;
}
コード例:
#include <iostream>
using namespace std;
int main() {
int day = 3;
switch (day) {
case 1:
cout << "Monday\n";
case 2:
cout << "Tuesday\n";
case 3:
cout << "Wednesday\n";
case 4:
cout << "Thursday\n";
case 5:
cout << "Friday\n";
case 6:
cout << "Saturday\n";
case 7:
cout << "Sunday\n";
}
}
出力:
Wednesday
Thursday
Friday
Saturday
Sunday
変数 day = 3
の値が評価され、case 3
であるそれぞれの case ステートメントと照合され、"Wednesday"
であるステートメントが出力されますが、残りの文字列は制御は case 3
に進み、そこからスイッチブロックの終わりまで、すべてのステートメントが出力/評価されます。
そのため、ケース
4,5,6,7 のステートメントが出力されます。
これを回避するには、switch-case
構造を変更する必要があります。
構文-変更された switch-case
:
switch(variable / expression)
{
case constant-expression 1:
statements;
break; (optional)
case constant-expression 2:
statements;
break; (optional)
default: //default statment optional
statements;
break;
}
break
キーワードは、スイッチブロックの実行を停止して終了するために使用されます。条件/ケースが一致すると、ステートメントを評価し、フローを中断して、スイッチブロックから抜け出します。
default
キーワードは、大文字と小文字が一致しない場合に実行されるステートメントを指定します。
コード例:
#include <iostream>
using namespace std;
int main() {
int day = 3;
switch (day) {
case 1:
cout << "Monday\n";
break;
case 2:
cout << "Tuesday\n";
break;
case 3:
cout << "Wednesday\n";
break;
case 4:
cout << "Thursday\n";
break;
case 5:
cout << "Friday\n";
break;
case 6:
cout << "Saturday\n";
break;
case 7:
cout << "Sunday\n";
break;
default:
cout << "Wrong option entereted\n";
break;
}
}
出力:
Wednesday
この次の例では、char
で切り替えることもできます。文字が母音であるか子音であるかをチェックするサンプルコードが表示されます。
コード例:
#include <iostream>
using namespace std;
int main() {
char x = 'u';
switch (x) {
case 'a':
cout << "Vowel";
break;
case 'e':
cout << "Vowel";
break;
case 'i':
cout << "Vowel";
break;
case 'o':
cout << "Vowel";
break;
case 'u':
cout << "Vowel";
break;
default:
cout << "Consonant";
break;
}
}
出力:
Vowel
C++ で Switch Case
を使用する際のルールとプロパティ
switch
ステートメント内で使用される式は、定数値
である必要があります。それ以外の場合は無効と見なされます。
ここでは、固定値が割り当てられている定数式と変数式を使用できることがわかります。
```c++
switch (1 + 2 + 3 * 4 + 5)
switch (a + b + c * d)
```
-
default
とbreak
はオプションです。switch-case
にそれらがなくても、問題なく動作します。 -
switch
ステートメントのネストは有効です。つまり、ステートメントを別のステートメント内で切り替えることができます。これは良いプログラミング手法ではありませんが、それでも利用できます。#include <iostream> using namespace std; int main() { int ID = 1234; int password = 000; switch (ID) { case 1234: cout << "checking info......\n"; switch (password) { case 000: cout << "Login successful\n"; break; default: cout << "Password don't match please check it\n"; break; } break; default: printf("incorrect ID"); break; } }
出力:
checking info...... Login successful
-
switch
ステートメント内で使用される式は、整数型である必要があります。つまり、int
、char
、またはenum
である必要があります。そうしないと、コンパイルエラーが発生します。#include <iostream> using namespace std; int main() { float x = 12.34; switch (x) { case 1.1: cout << "Yes"; break; case 12.34: cout << "NO"; break; } }
出力:
[Error] switch quantity not an integer
-
default
ブロックはswitch
内に置くことができますが、一致するケースがない場合にのみ実行されます。#include <iostream> using namespace std; int main() { int x = 45; switch (x) { default: cout << "It's not 1 or 2"; break; case 1: cout << "It's a 1"; break; case 2: cout << "It's a 2"; break; } }
出力:
It's not 1 or 2
-
ケースの上に書かれたステートメントは決して実行されません。
switch
ステートメントが評価されると、コントロールは一致するケースまたはdefault
ブロック(存在する場合)のいずれかにシフトします。#include <iostream> using namespace std; int main() { int x = 45; switch (x) { cout << "Tony is Iron Man\n"; case 1: cout << "It's a 1"; break; case 2: cout << "It's a 2"; break; default: cout << "It's not 1 or 2"; break; } }
出力:
It's not 1 or 2
-
ケースラベルを複製することはできません。指定すると、コンパイルエラーが発生します。
#include <iostream> using namespace std; int main() { int x = 45; switch (x) { case 45: cout << "Iron Man"; break; case 40 + 5: cout << "tony stark"; break; default: cout << "It's not 1 or 2"; break; } }
出力:
[Error] duplicate case value
-
ケースラベルも一定である必要があります。そうしないと、コンパイルエラーが発生します。
#include <iostream> using namespace std; int main() { int x = 2; int arr[] = {100, 200, 300}; switch (x) { case arr[0]: cout << "Iron Man"; break; case arr[1]: cout << "tony stark"; break; case arr[2]: cout << "It's not 1 or 2"; break; } }
出力:
[Error] the value of 'arr' is not usable in a constant expression
-
同じタスクを実行するすべての
case
ステートメントをグループ化できます。#include <iostream> using namespace std; int main() { char x = 'A'; switch (x) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'A': case 'E': case 'I': case 'O': case 'U': cout << "Vowel"; break; default: cout << "consonant"; } }
C++ での switch
ステートメントと if-else
ステートメントの違い
if-else
ステートメントが多数ある場合、コンパイラは、有効な一致が見つかるまでそれらすべてをチェックする必要があります。switch-case
では、特定の条件が満たされた場合に、特定のコードブロックのみを実行する場合にステートメントが使用されます。
次の例では、文字がアルファベットかどうかをチェックします。
コード例:
char x = '+';
if (x == 'A')
....
else if (x == 'B')...
else if (x == 'C')...
....else cout
<< "Not an alphabet"
+
はアルファベットではないため、最初にすべての前の条件を調べる必要があるため、最後に到達するまでにはるかに長い時間がかかります。switch-case
を使用して実装した場合、ケース/条件の数が非常に多い場合は、ルックアップテーブルまたはハッシュリストを使用します。
これは、すべてのアイテムが同じアクセス時間を取得することを意味します。したがって、多くのケース/条件
がある場合は、if-else
よりも switch
の方が高速であるため、優先されます。