switch 文
整数引数の値に従ってコードを実行します。
多くの分岐からひとつまたはいくつかのコードを整数値に従って実行する必要のあるときに使用されます。
構文
switch ( expression ) statement
|
|||||||||
| expression | - | 整数型 (char、符号付きまたは符号なし整数、または列挙) の任意の式 |
| statement | - | 任意の文 (一般的には複文)。 case: および default: ラベルを statement 内で使用することができ、 break; 文が特別な意味を持ちます。
|
case constant_expression : statement
|
(1) | ||||||||
default : statement
|
(2) | ||||||||
| constant_expression | - | 任意の整数定数式。 |
説明
switch 文の本体は、すべての constant_expression の (expression の昇格した型への変換後の) 値が一意である限り、任意の個数の case: ラベルを持つことができます。 また、多くとも1個の default: ラベルを持つことができます (ネストした switch 文はそれ自身の default: を持つことができ、外側の switch で使用されているものと同一の定数の case: ラベルを持つことができます)。
expression が expression の昇格した型への変換後の constant_expression のいずれかの値と等しい値に評価された場合は、その constant_expression のラベルが付いた文に制御が転送されます。
expression がいずれの case: ラベルにも一致しない値に評価され、 default: ラベルが存在する場合は、その default: ラベルが付けられた文に制御が転送されます。
expression がいずれの case: ラベルにも一致しない値に評価され、 default: ラベルが存在しない場合は、 switch の本体は何も実行されません。
break 文は、 statement 内のどこかで遭遇したとき、 switch 文を終了します。
switch(1) {
case 1 : puts("1"); // 「1」を表示し、
case 2 : puts("2"); // その後「2」を表示します (「フォールスルー」)。
}
switch(1) {
case 1 : puts("1"); // 「1」を表示し、
break; // その後 switch を終了します。
case 2 : puts("2");
break;
}
|
他のすべての選択文および繰り返し文と同様に、 switch 文はブロックスコープを確立します。 expression 内で導入されたあらゆる識別子は、 statement の後、スコープ外になります。 VLA または可変修飾型の別の識別子がそのスコープ内に switch (expr)
{
int i = 4; // VLA ではない。 ここで宣言できます。
f(i); // 決して呼ばれません。
// int a[i]; // エラー、ここでは VLA を宣言できません。
case 0:
i = 17;
default:;
int a[i]; // ここでは VLA を宣言できます。
printf("%d\n", i); // expr == 0 の場合は 17 を表示し、そうでなければ不定値を表示します。
}
|
(C99以上) |
キーワード
例
#include <stdio.h>
void func(int x)
{
printf("func(%d): ", x);
switch(x)
{
case 1: printf("case 1, ");
case 2: printf("case 2, ");
case 3: printf("case 3.\n"); break;
case 4: printf("case 4, ");
case 5: printf("case 5, ");
default: printf("default.\n");
}
}
int main(void)
{
for(int i = 1; i < 10; ++i) func(i);
}
出力:
func(1): case 1, case 2, case 3.
func(2): case 2, case 3.
func(3): case 3.
func(4): case 4, case 5, default.
func(5): case 5, default.
func(6): default.
func(7): default.
func(8): default.
func(9): default.
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.8.4.2 The switch statement (p: 149-150)
- C99 standard (ISO/IEC 9899:1999):
- 6.8.4.2 The switch statement (p: 134-135)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.6.4.2 The switch statement
関連項目
switch 文 の C++リファレンス
|