switch
ステートメント (C)
switch
および case
ステートメントを使用すると、複雑な条件付き処理や分岐処理を制御しやすくなります。 switch
ステートメントは、本体内のステートメントに制御を移します。
構文
selection-statement
:
switch (
expression
)
statement
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
注釈
switch
ステートメントを指定すると、 の値に応じて、ステートメント本体の 1 つの expression
labeled-statement
にコントロールが転送されます。
expression
の値 および各 constant-expression
には整数型を指定する必要があります。 constant-expression
は、コンパイル時に明確な定数の整数値を持つ必要があります。
コントロールは、 constant-expression
値が expression
の値と一致する case
ステートメントに渡されます。 switch
ステートメントには、任意の数の case
インスタンスを含めることができます。 ただし、同じ switch
ステートメント内で 2 つの constant-expression
値が同じ値を持つことはできません。 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
ステートメントは、expression
の値と等しい case
constant-expression
値がない場合に実行されます。 default
ステートメントがなく、 case
に一致するものが見つからない場合は、 switch
本体のステートメントは実行されません。 default
ステートメントは、最大で 1 つだけ指定できます。 default
ステートメントは、最後に存在する必要はありません。 switch
ステートメントの本体の任意の場所に出現できます。 case
または default
ラベルは、 switch
ステートメント内でのみ使用できます。
switch
expression
および case
constant-expression
は整数型である必要があります。 各 case
constant-expression
の値は、ステートメント本体内で一意である必要があります。
ステートメント本体の case
および switch
default
ラベルは、ステートメント本体内のどこで実行が開始されるかが決まる初期テストでのみ重要です。 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
がインクリメントされます。 c
が 'A'
または 'a'
と等しくない場合、total
のみがインクリメントされます。
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
この例では、 break
ステートメントは switch
本体の各ステートメントに続きます。 break
ステートメントによって、1 つのステートメントの実行後にステートメント本体を終了することが強制されます。 i
が -1 と等しい場合、n
だけがインクリメントされます。 n++;
ステートメントに続く break
により、残りのステートメントをバイパスして、実行制御をステートメント本体の外部に渡すことが強制されます。 同様に、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 では、 switch
ステートメントの case
値の数を制限していません。 この数は、使用できるメモリによってのみ制限されます。 ANSI C では、1 つの switch
ステートメント内に 257 個までの case
ラベルを使用できます。
Microsoft C のdefaultでは、Microsoft 拡張機能が有効になっています。 これらの拡張機能を無効にするには、/Za コンパイラ オプションを使用します。