名前空間
変種
操作

switch 文

From cppreference.com
< c‎ | language

整数型の引数の値に応じてコードを実行します。

整数値に応じて、多くのコード分岐の中から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(1) {
    case 1 : puts("1"); // prints "1",
    case 2 : puts("2"); // then prints "2" ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // prints "1"
             break;     // and exits the switch
    case 2 : puts("2");
             break;
}

他のすべての選択文や反復文と同様に、switch 文はブロック・スコープを確立します。で導入された識別子は、の後でスコープ外になります。

VLA (可変長配列) や他の可変修飾型を持つ識別子が、そのスコープ内に case: または default: ラベルを持つ場合、switch 文全体がそのスコープ内になければなりません (言い換えれば、VLA は switch 全体の前か、最後のラベルの後のどちらかで宣言されなければなりません)。

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

[編集] キーワード

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:
      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

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)