switch 文
整数型の引数の値に応じてコードを実行します。
整数値に応じて、多くのコード分岐の中から1つまたは複数実行する必要がある場合に使用されます。
目次 |
[編集] 構文
属性指定子シーケンス(省略可能) switch ( 式 ) 文 |
|||||||||
| attr-spec-seq | - | (C23)switch 文に適用される属性の省略可能なリスト |
| 式 | - | 整数型 (char、符号付きまたは符号無し整数、あるいは列挙型) の任意の式 |
| 文 | - | 任意の文 (通常は複合文)。case: ラベルと default: ラベルは文の中で使用でき、break; 文は特別な意味を持ちます。 |
case 定数式 : 文 |
(1) | (C23まで) | |||||||
属性指定子シーケンス(省略可能) case 定数式 : 文(省略可能) |
(1) | (C23以降) | |||||||
default : 文 |
(2) | (C23まで) | |||||||
属性指定子シーケンス(省略可能) default : 文(省略可能) |
(2) | (C23以降) | |||||||
| 定数式 | - | 任意の整数定数式 |
| attr-spec-seq | - | (C23)ラベルに適用される属性の省略可能なリスト |
[編集] 解説
switch 文の本体には任意の数の case: ラベルを持つことができます。ただし、すべての定数式の値は (式の格上げされた型へ変換された後で) 一意でなければなりません。default: ラベルは最大でも1つしか存在できません (ただし、ネストされた switch 文では、独自の default: ラベルを持ったり、外側の switch で使用されている定数と同じ定数を持つ case: ラベルを持つことができます)。
式が、式の格上げされた型に変換された後で、いずれかの定数式の値と等しい値に評価された場合、制御はその定数式でラベル付けされた文に移ります。
式がいずれの case: ラベルにも一致しない値に評価され、かつ default: ラベルが存在する場合、制御は default: ラベルでラベル付けされた文に移ります。
式がいずれの case: ラベルにも一致しない値に評価され、かつ default: ラベルが存在しない場合、switch 本体は何も実行されません。
文のどこかで break 文が現れると、switch 文を抜けます。
|
他のすべての選択文や反復文と同様に、switch 文はブロック・スコープを確立します。式で導入された識別子は、文の後でスコープ外になります。 VLA (可変長配列) や他の可変修飾型を持つ識別子が、そのスコープ内に switch (expr) { int i = 4; // not a VLA; OK to declare here f(i); // never called // int a[i]; // error: VLA cannot be declared here case 0: i = 17; default: int a[i]; // OK to declare VLA here printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise } |
(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: case 6: printf("case 5 or case 6, "); default: printf("default.\n"); } } int main(void) { for(int i = 1; i < 9; ++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 or case 6, default. func(5): case 5 or case 6, default. func(6): case 5 or case 6, default. func(7): default. func(8): default.
[編集] 参照
- C17標準 (ISO/IEC 9899:2018)
- 6.8.4.2 The switch statement (p: 108-109)
- C11標準 (ISO/IEC 9899:2011)
- 6.8.4.2 The switch statement (p: 149-150)
- C99標準 (ISO/IEC 9899:1999)
- 6.8.4.2 The switch statement (p: 134-135)
- C89/C90標準 (ISO/IEC 9899:1990)
- 3.6.4.2 The switch statement
[編集] 関連項目
switch 文のC++ ドキュメント |