switch语句

来自cppreference.com
< c‎ | language

根据整数参数执行代码。

在需要根据整数值执行多个分支中的一个或数个之处使用。

目录

[编辑] 语法

switch ( expression ) statement
expression - 任何整数类型(char、有符号或无符号整数,或枚举)的表达式
statement - 任何语句(典型的是复合语句)。允许在statement中有case:default:标号,且break;语句拥有特殊含义。
case constant_expression : statement (1)
default : statement (2)
constant_expression - 任何整数常量表达式

[编辑] 解释

switch语句体可以拥有任意数量的case:标号,只要所有constant_expressions是独一无二的(在转换expression的提升类型后)。至多可以存在一个default:标号(尽管嵌套的switch语句可以用它们自己的default:标号或拥有常量等于整体switch所用的case:)。

expression求值为等于constant_expression在转换到expression的提升类型后的值之一的值,则控制被转移到以拥有该constant_expression的标号标注的语句。

expression求值为不匹配任何case:标号的值,且存在default:标号,则控制被转移到以default:标号标注的语句。

expression求值为不匹配任何case:标号的值,且不存在default:标号,则不执行switch体的任何部分。

statement的任何位置遇到break语句时,跳出循环体:

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;声明于此OK
    f(i); // 决不调用
//  int a[i]; // 错误:VLA不可声明于此
  case 0:
    i = 17;
default:;
    int a[i]; // 在此声明VLA OK
    printf("%d\n", i); // 若if expr == 0则打印17,否则打印不确定值
}
(C99起)


[编辑] 关键词

switchcasedefault

[编辑] 示例

#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++文档