名前空間
変種
操作

switch 文

提供: cppreference.com
< c‎ | language

整数引数の値に従ってコードを実行します。

多くの分岐からひとつまたはいくつかのコードを整数値に従って実行する必要のあるときに使用されます。

目次

[編集] 構文

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: ラベルを持つことができます)。

expressionexpression の昇格した型への変換後の 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 または可変修飾型の別の識別子がそのスコープ内に case: または default: ラベルを持つ場合は、 switch 文全体がそのスコープ内になければなりません (別の言い方をすると、 VLA は switch 文全体より前か、最後のラベルより後で宣言されなければなりません)。

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以上)


[編集] キーワード

switch, case, default

[編集]

#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++リファレンス