switch ステートメント (C++)
必要な式の値に応じてコードの複数セクションの間の選択を許可します。
switch ( expression )
case constant-expression : statement
[default : statement]
解説
式は 整数型または整数型を明確な変換を持つクラス型である必要があります。の整数の上位変換は の整数の上位変換 で実行されます。
switch の本体はステートメント case の一連のラベルと 既定 のオプションのラベルで構成されます。case のステートメントの 2 種類の定数式が同じ値に評価できません。 既定 のラベルは一度だけ使用できます。ラベル付きステートメントが構文的な要件ではありませんがswitch のステートメントはなしでも無意味です。既定のステートメントの最後に取得されます必要ではありません ; これはswitch ステートメントの本体での場所で使用できます。ケースまたは default ラベルは switch ステートメント内でのみ使用できます。
case の各ラベルの 定数式は 式 の型に変換され等値の 式 と比較されます。コントロールは case の 定数式と 式 の値と一致するステートメントに制御が渡されます。結果の動作は次のとおりです。
Switch ステートメントの動作
状態 |
動作 |
---|---|
変換後の値を一致発生したレベルを制御する式です。 |
コントロールはそのラベルに続くステートメントに移動します。 |
定数でも case ラベルの定数は一致しません); 既定 のラベルはです。 |
コピーされます 既定 のラベルに制御します。 |
定数でも case ラベルの定数は一致しません); 既定 のラベルはありません。 |
コントロールは switch ステートメントの次のステートメントに移動します。 |
match 式がの場合コントロールは後続の case または 既定 のラベルで阻害されません。中断 のステートメントが switch ステートメントの次のステートメントに制御を移動および実行を停止するために使用されます。 中断 のステートメントがない場合case に一致するラベルの switch のステートメントの最後には 既定 が実行されます。次に例を示します。
// switch_statement1.cpp
#include <stdio.h>
int main() {
char *buffer = "Any character stream";
int capa, lettera, nota;
char c;
capa = lettera = nota = 0;
while ( c = *buffer++ ) // Walks buffer until NULL
{
switch ( c )
{
case 'A':
capa++;
break;
case 'a':
lettera++;
break;
default:
nota++;
}
}
printf_s( "\nUppercase a: %d\nLowercase a: %d\nTotal: %d\n",
capa, lettera, (capa + lettera + nota) );
}
上の例ではcapa は c が大文字の場合 A インクリメントします。capa++ が while に switch のステートメント本体やコントロール パスの実行を終了した後 break のステートメントはループ。break のステートメントがない場合lettera と nota もインクリメントされます。同じような目的は case 'a' の break のステートメントによって提供されます。c が小文字の a 場合lettera をインクリメントしbreak のステートメントは switch のステートメント本体を終了します。c が a または A であるdefault のステートメントが実行されます。
switch のステートメント ブロックの中には到達できる限り - 可能なすべての実行パスでつまりバイパスされていない初期化の定義を含めることができます。これらの宣言を使用して導入された名前はローカル スコープを持ちます。次に例を示します。
// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
switch( tolower( *argv[1] ) )
{
// Error. Unreachable declaration.
char szChEntered[] = "Character entered was: ";
case 'a' :
{
// Declaration of szChEntered OK. Local scope.
char szChEntered[] = "Character entered was: ";
cout << szChEntered << "a\n";
}
break;
case 'b' :
// Value of szChEntered undefined.
cout << szChEntered << "b\n";
break;
default:
// Value of szChEntered undefined.
cout << szChEntered << "neither a nor b\n";
break;
}
}
switch のステートメントは入れ子にできます。この場合case または 既定 のラベルはを囲む switch の最も近いステートメントに関連付けます。
Microsoft 固有の仕様 →
Microsoft C は switch のステートメントのケース値の数を制限しません。数は使用できるメモリの容量によってのみ制限されます。ANSI C では 15 switch のステートメントで 257 以上の case ラベルを実行する必要があります。
Microsoft C の既定値は Microsoft 拡張機能を有効にする必要があります。これらの拡張機能を無効にする /Za コンパイラ オプションを使用します。