switch statement
根据整型参数的值执行相应代码。
用于根据整数值执行多个代码分支中的一个或多个分支的情况。
目录 |
语法
属性说明序列
(可选)
switch (
表达式
)
语句
|
|||||||||
| attr-spec-seq | - |
(C23)
可选的
属性
列表,应用于
switch
语句
|
| expression | - | 任意 表达式 ,其类型为 整数类型 (char、有符号或无符号整数,或枚举类型) |
| statement | - |
任意
语句
(通常为复合语句)。
case:
和
default:
标签允许出现在
statement
中,且
break
;
语句具有特殊含义
|
case
常量表达式
:
语句
|
(1) | (C23前) | |||||||
属性说明序列
(可选)
case
常量表达式
:
语句
(可选)
|
(1) | (C23起) | |||||||
default
:
语句
|
(2) | (C23前) | |||||||
属性说明序列
(可选)
default
:
语句
(可选)
|
(2) | (C23起) | |||||||
| constant-expression | - | 任意整数 常量表达式 |
| attr-spec-seq | - | (C23) 可选的 属性 列表,应用于标签 |
说明
switch语句的主体可以包含任意数量的
case:
标签,只要所有
常量表达式
的值(在
转换
为
表达式
的
提升类型
后)保持唯一。最多只能存在一个
default:
标签(尽管嵌套的switch语句可以使用它们自己的
default:
标签,或包含与外围switch中使用的常量相同的
case:
标签)。
如果 expression 在转换为提升类型后,其求值结果等于某个 constant-expression 的值,则控制权将转移到标有该 constant-expression 的语句。
如果
expression
求值结果与所有
case:
标签都不匹配,且存在
default:
标签时,控制流将跳转至带有
default:
标签的语句。
如果
expression
求值结果与所有
case:
标签都不匹配,且不存在
default:
标签时,则不会执行switch语句体中的任何代码。
break 语句,当在 statement 中的任何位置遇到时,将退出 switch 语句:
|
与所有其他选择语句和迭代语句一样,switch语句会建立 块作用域 :任何在 表达式 中引入的标识符会在 语句 结束后超出作用域。
若可变长度数组或其他具有可变修改类型的标识符在其作用域内存在
switch (expr) { int i = 4; // 不是VLA;允许在此声明 f(i); // 永远不会被调用 // int a[i]; // 错误:不能在此声明VLA case 0: i = 17; default: int a[i]; // 允许在此声明VLA printf("%d\n", i); // 若expr == 0则输出17,否则输出不确定值 } |
(C99起) |
关键词
示例
#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语句(页码:134-135)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 3.6.4.2 switch 语句
参见
|
C++ 文档
关于
switch
语句
|