命名空间
变体
操作

switch 语句

来自 cppreference.com
< c‎ | 语言

根据整型参数的值执行代码。

用于根据整型值执行许多代码分支中的一个或多个分支。

内容

[编辑] 语法

attr-spec-seq(可选) switch ( expression ) statement
attr-spec-seq - (C23)可选的 属性 列表,应用于 switch 语句
expression - 任何 表达式,类型为 整型(char,带符号或无符号整型,或枚举型)
statement - 任何 语句(通常是复合语句)。case:default: 标签在 statement 中是允许的,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 起)
constant-expression - 任何整型 常量表达式
attr-spec-seq - (C23)可选的 属性 列表,应用于标签

[编辑] 说明

switch 语句的主体可以包含任意数量的 case: 标签,只要所有 constant-expressions 的值是唯一的(在转换为 expression提升类型 之后)。最多只能有一个 default: 标签(虽然嵌套的 switch 语句可以使用自己的 default: 标签,或者具有与封闭 switch 中使用的标签相同的常量的 case: 标签)。

如果 expression 的计算结果与其中一个 constant-expressions 的值相等(在转换为 expression 的提升类型之后),则控制权将转移到用该 constant-expression 标记的语句。

如果 expression 的计算结果与任何 case: 标签都不匹配,并且存在 default: 标签,则控制权将转移到用 default: 标签标记的语句。

如果 expression 的计算结果与任何 case: 标签都不匹配,并且不存在 default: 标签,则不会执行 switch 主体的任何内容。

当在 statement 中遇到 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 语句建立了 块作用域:在 expression 中引入的任何标识符在 statement 之后将超出作用域。

如果 VLA 或另一个具有可变修饰类型的标识符在其作用域内具有 case:default: 标签,则整个 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 起)

[编辑] 关键字

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++ 文档 for switch 语句