Switch 语句
switch 主体中的不同语句。 switch 表达式必须求值为整数或枚举值。 switch 语句的主体包含由以下内容组成的 case 子句 :case标签- 可选
default标签 case表达式- 语句列表。
如果 switch 表达式的值等于其中一个 case 表达式的值,那么将处理该 case 表达式之后的语句。 如果没有,那么将处理缺省标签语句 (如果有)。
case 子句 包含 case label ,后跟任意数目的语句。 Case 子句具有以下格式:
case label 包含单词 case ,后跟整数常量表达式和冒号。 每个整数常量表达式的值必须表示不同的值; 不能有重复的 case 标签。 您可以在任何位置放置一个 case 标签,也可以放置多个 case 标签。 案例标签具有以下格式:
缺省子句 包含后跟一个或多个语句的 default 标签。 您可以将 case 标签放在 default 标签的两侧。 switch 语句只能有一个 default 标签。 default_clause 具有以下格式:
switch 语句将控制权传递给其中一个标签后面的语句或 switch 主体后面的语句。 switch 主体之前的表达式的值确定了接收控制的语句。 此表达式称为 switch expression。
switch 表达式的值将与每个 case 标签中表达式的值进行比较。 如果找到匹配值,那么会将控件传递到包含匹配值的 case 标签后面的语句。 如果没有匹配的值,但 switch 主体中有 default 标签,那么控件将传递到 default 标记的语句。 如果找不到匹配的值,并且 switch 主体中的任何位置没有 default 标签,那么不会处理 switch 主体的任何部分。
当控制传递到 switch 主体中的语句时,仅当迂到 break 语句或处理 switch 主体中的最后一个语句时,控制才会离开 switch 主体。
如果需要,将对控制表达式执行整数提升,并且 case 语句中的所有表达式都将转换为与控制表达式相同的类型。 如果存在单个到整数或枚举类型的转换,那么 switch 表达式也可以是类类型。
使用选项 -qinfo=gen 进行编译将查找不应该出现的案例标签。
对 switch 语句的限制
您可以将数据定义放在 switch 主体的开头,但编译器不会在 switch 主体的开头初始化 auto 和 register 变量。 您可以在 switch 语句的主体中具有声明。
不能使用 switch 语句来跳过初始化。
当具有可变修改类型的标识符的作用域包括 switch 语句的大小写或缺省标签时,整个 switch 语句被视为在该标识符的作用域内。 即,标识的声明必须在 switch 语句之前。
在 C++ 中,除非声明位于一个内嵌块中,且该内嵌块完全绕过了控制转移,否则不能转移对包含显式或隐式初始化器的声明的控制。 switch 声明正文中包含初始化语句的所有声明必须包含在一个内部块中。 
switch 语句的示例
以下 switch 语句包含多个 case 子句和一个 default 子句。 每个子句都包含一个函数调用和一个 break 语句。 break 语句阻止控制通过 switch 主体中的每个语句传递。
如果 switch 表达式求值为 '/',那么 switch 语句将调用函数 divide。 然后,控制将传递到 switch 主体后面的语句。
char key;
printf("Enter an arithmetic operator\n");
scanf("%c",&key);
switch (key)
{
case '+':
add();
break;
case '-':
subtract();
break;
case '*':
multiply();
break;
case '/':
divide();
break;
default:
printf("invalid key\n");
break;
}如果 switch 表达式与 case 表达式匹配,那么将处理 case 表达式后面的语句,直到迂到 break 语句或到达 switch 主体的末尾为止。 在以下示例中, break 语句不存在。 如果 text[i] 的值等于 'A',那么所有三个计数器都将递增。 如果 text[i] 的值等于 'a',那么将增大 lettera 和 total 。 仅当 text[i] 不等于 'A' 或 'a'时,才会增大 total 。
char text[100];
int capa, lettera, total;
// ...
for (i=0; i<sizeof(text); i++) {
switch (text[i])
{
case 'A':
capa++;
case 'a':
lettera++;
default:
total++;
}
}以下 switch 语句对多个 case 标签执行相同的语句:
/**
** This example contains a switch statement that performs
** the same statement for more than one case label.
**/
#include <stdio.h>
int main(void)
{
int month;
/* Read in a month value */
printf("Enter month: ");
scanf("%d", &month);
/* Tell what season it falls into */
switch (month)
{
case 12:
case 1:
case 2:
printf("month %d is a winter month\n", month);
break;
case 3:
case 4:
case 5:
printf("month %d is a spring month\n", month);
break;
case 6:
case 7:
case 8:
printf("month %d is a summer month\n", month);
break;
case 9:
case 10:
case 11:
printf("month %d is a fall month\n", month);
break;
case 66:
case 99:
default:
printf("month %d is not a valid month\n", month);
}
return(0);
}如果表达式 month 的值为 3,那么控件将传递到语句:
printf("month %d is a spring month\n", month);break 语句将控制权传递给 switch 主体之后的语句。
