名稱空間
變體
操作

switch 語句

來自 cppreference.com
< c‎ | 語言

根據整數引數的值執行程式碼。

用於需要根據整數值執行多個程式碼分支中的一個或幾個分支的情況。

目錄

[編輯] 語法

attr-spec-seq(可選) switch ( expression ) statement
屬性說明序列 - (C23)可選的屬性列表,應用於 switch 語句
表示式 - 任何表示式,其型別為整數型別(char、有符號或無符號整數,或列舉)
語句 - 任何語句(通常是複合語句)。case:default: 標籤允許出現在語句中,並且 break; 語句具有特殊含義。
case constant-expression : statement (1) (直至 C23)
attr-spec-seq(可選) case constant-expression : statement(可選) (1) (自 C23 起)
default : statement (2) (直至 C23)
attr-spec-seq(可選) default : statement(可選) (2) (自 C23 起)
常量表達式 - 任何整數常量表達式
屬性說明序列 - (C23)可選的屬性列表,應用於標籤

[編輯] 解釋

switch 語句的主體可以有任意數量的 case: 標籤,只要所有常量表達式的值是唯一的(在轉換表示式提升型別之後)。最多隻能有一個 default: 標籤(儘管巢狀的 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 switch 語句 (p: 108-109)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.8.4.2 switch 語句 (p: 149-150)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.8.4.2 switch 語句 (p: 134-135)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.6.4.2 switch 語句

[編輯] 另請參閱

C++ 文件,關於 switch 語句