switch 语句
来自 cppreference.com
根据整型参数的值执行代码。
用于根据整型值执行许多代码分支中的一个或多个分支。
内容 |
[编辑] 语法
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 语句建立了 块作用域:在 expression 中引入的任何标识符在 statement 之后将超出作用域。 如果 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 起) |
[编辑] 关键字
[编辑] 示例
运行此代码
#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 语句 |