全文中使用的C标准为C99,ANSI C,如果没有特别说明默认为此。
C++则是Dev 5.7.1的C++版本。
C的Switch和case常见语法:
switch (expression) statement
其中expression的结果必须是整数值。
尽管直接使用一条语句也是可以的,但结果效果如下:
switch (expression)
{
statement-list
}
贯穿于statement-list 的标签如下:
case constant-expression:
每一个case标签必须具有一个唯一的值:
常量表达式(constant-expression),constant-expression指的是编译期间进行求值的表达式,他不能是任何变量。
case与执行流case语句最特殊的点在于,它并不把语句划分成几个执行部分,而是通过case来确定语句列表的进入点。
执行过程如下:
- 计算完成expression的内容。
- 执行流转到语句列表中其case标签值与expression值匹配的语句。
- 从上一条语句执行开始,一直到switch-case的底部。
这里面的语句均会被执行。
举个例子:
switch (month)
{
case 12:
printf("%d",12);
case 11:
printf("%d",11);
}
结果呢,可能和你想象的不一样。
当month等于12的时候,结果如下:
1211
这就是执行流造成的结果,导致case标签后边的语句都会被执行,包括其他的case。
那么可以实现将代码划分为不同的部分的功能吗?当然有,break语句就是。
break语句break语句使用很简单,就是让case流在不同的位置停下来。让switch以更传统的方式运行。
使用方法如下:
switch (month)
{
case 12:
printf("%d",12);
break;
case 11:
printf("%d",11);
case 10:
printf("%d",10);
}
结果如下:
12 12 -------------------------------- Process exited after 4.971 seconds with return value 0 请按任意键继续. . .break的习惯
需要提醒的是,最后的case的需要break吗?理论上来说传统的break语法中,我们不需要在最后的case中添加break。因为没有case会继续执行,但是为了未来修改的一致性,我们还是在最后加上break,以后添加case选项的时候就不需要补充了。
为了让不同的表达式值时能够执行,可以使多个case标签对应,如下所示:
switch (month)
{
case 12:
printf("%d",12);
break;
case 11:
case 10:
printf("%d %d",10,11);
break;
}
结果如下:
11 1011 -------------------------------- 10 1011 --------------------------------default子句
如果存在一种情况,所有case的标签值都不匹配,但是你想找一个兜底的条件,就可以使用default子句,把下面的标签放到case可以出现的位置。
default:
也就是说你可以这样写:
switch (month)
{
case 12:
printf("%d",12);
break;
default :
printf("%s","default");
case 11:
case 10:
printf("%d %d",10,11);
break;
}
结果如下:
9 default1011 --------------------------------
这样就丧失了default的意义,不过还是很有趣hhhh。



