命名空间
变体
操作

switch 语句

来自 cppreference.cn
< 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 语句