switch および case ステートメントを使用すると、複雑な条件付き処理や分岐処理を制御しやすくなります。
switch ステートメントは、本体内のステートメントに制御を移します。
構文
selection-statement=
switch ( expression ) statement
labeled-statement=
case constant-expression : statement
default : statement
注釈
switch ステートメントを指定すると、 の値に応じて、ステートメント本体の 1 つの labeled-statementexpression にコントロールが転送されます。
expression の値 および各 constant-expression には整数型を指定する必要があります。
constant-expression は、コンパイル時に明確な定数の整数値を持つ必要があります。
コントロールは、 case 値が constant-expression の値と一致する expression ステートメントに渡されます。
switch ステートメントには、任意の数の case インスタンスを含めることができます。 ただし、同じ constant-expression ステートメント内で 2 つの switch 値が同じ値を持つことはできません。
switch ステートメント本体の実行は、一致する labeled-statement 内またはその後の最初のステートメントで開始されます。 実行は、本文の最後まで、または break ステートメントによってコントロールが本文の外部に転送するまで続行されます。
通常、switch ステートメントは次のように使用します。
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
break ステートメントを使用して、 switch ステートメント内の特定のラベル付きステートメントの処理を終了できます。 これは、 switch ステートメントの最後に分岐します。
break がない場合、プログラムは次のラベル付きステートメントまで続き、 break またはステートメントの最後に達するまでステートメントが実行されます。 状況によっては、この継続が望ましい場合もあります。
default ステートメントは、case の値と等しい constant-expressionexpression 値がない場合に実行されます。
default ステートメントがなく、 case に一致するものが見つからない場合は、 switch 本体のステートメントは実行されません。
default ステートメントは、最大で 1 つだけ指定できます。
default ステートメントは、最後に存在する必要はありません。
switch ステートメントの本体の任意の場所に出現できます。
case または default ラベルは、 switch ステートメント内でのみ使用できます。
switch
expression および caseconstant-expression は整数型である必要があります。 各 caseconstant-expression の値は、ステートメント本体内で一意である必要があります。
ステートメント本体の case および defaultswitch ラベルは、ステートメント本体内のどこで実行が開始されるかが決まる初期テストでのみ重要です。
switch ステートメントは入れ子にすることができます。 静的変数は、switch ステートメントの実行前に初期化されます。
Note
宣言は、switch の本体を構成する複合ステートメントの先頭に記述できますが、宣言に含まれる初期化は行われません。
switch ステートメントは、初期化が含まれる行をバイパスして、本体内の実行可能なステートメントに直接制御を移します。
次の例に、switch ステートメントを示します。
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
この例の switch 本体の 3 つのステートメントは、c が 'A' と等しい場合にすべて実行されます。 break ステートメントは次の case の前に出現しないためです。 実行制御は最初のステートメント (capital_a++;) に移動し、本体の残りが順に継続されます。
c が 'a' と等しい場合、letter_a と total がインクリメントされます。
total が c または 'A' と等しくない場合、'a' のみがインクリメントされます。
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
この例では、 break ステートメントは switch 本体の各ステートメントに続きます。
break ステートメントによって、1 つのステートメントの実行後にステートメント本体を終了することが強制されます。
i が -1 と等しい場合、n だけがインクリメントされます。
break ステートメントに続く n++; により、残りのステートメントをバイパスして、実行制御をステートメント本体の外部に渡すことが強制されます。 同様に、i が 0 と等しい場合は z だけがインクリメントされ、i が 1 と等しい場合は p だけがインクリメントされます。 複合ステートメントの最後に制御は本体の外部に移るため、 break ステートメントは厳密には必要ありません。 一貫性を持たせるために含まれています。
次の例に示すように、1 つのステートメントに複数の case ラベルを含めることができます。
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
この例では、constant-expression が 'a' から 'f' の間の文字に等しい場合に convert_hex 関数が呼び出されます。
Microsoft 固有の仕様
Microsoft C では、 case ステートメントの switch 値の数を制限していません。 この数は、使用できるメモリによってのみ制限されます。 ANSI C では、1 つの case ステートメント内に 257 個までの switch ラベルを使用できます。
Microsoft C のdefaultでは、Microsoft 拡張機能が有効になっています。 これらの拡張機能を無効にするには、/Za コンパイラ オプションを使用します。