今天有段出糗的事情,写了一段代码,本来打算看下switch中具体走的哪个流程的,结果运行了半天也没有打印出来。
代码类型类似如下:
#include <stdio.h>
int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
switch(1) {
printf("statement will never be executed! \n");
default:
printf("default \n");
}
return 0;
}
直接说结果,下面这段打印永远不会被执行。
printf("statement will never be executed! \n");
具体原因的话,是因为switch是一个选择判断语句,它必须是满足某项条件后,再去执行下面的语句。
而上述的代码,switch与default之间的这段打印,永远不可能满足条件。
switch case语句的用法:
switch (expression) {
case value1:
// 当 expression 的结果与 value1 匹配时,执行此处语句
[break;]
case value2:
// 当 expression 的结果与 value2 匹配时,执行此处语句
[break;]
...
case valueN:
// 当 expression 的结果与 valueN 匹配时,执行此处语句
[break;]
[default:
// 如果 expression 与上面的 value 值都不匹配时,执行此处语句
[break;]]
}
我们平时基本也就是按照这个语法规则来写switch case。仔细想想里面其实有几个问题值得好好想想。
问题1: 每个case都需要一个break吗?
答: 不是。
详解: 首先搞清楚break的作用是跳出当前这个switch语句,执行switch case之后的代码。看下面一个例子:
switch (num) {
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
default:
printf("unknown \n");
}
说明:
如果输入num为1则输出结果:
1
如果输入num为2则输出结果:
2
从例子可以明显看出没有break的话则会从条件匹配的 case 语句开始运行,然后不论是否符合条件继续持续执行下一个 case 语句,直到遇到break或者执行完所有case。
问题2: default必须放在最后吗?
答: 不是。
详解: default就是在所有其他case都不满足条件的情况下执行,不论你放在哪个位置都可以被执行。看下面两个例子:
switch (1) {
case 1:
printf("1\n");
break;
default:
printf("unknown \n");
break;
case 2:
printf("2\n");
break;
}
说明:
如果输入num为1则输出结果:
1
如果输入num为2则输出结果:
2
如果输入num的条件都不满足,则输出结果:
unknown
问题3: default是必须要有的吗?
答: 不是。
详解: 从语法上来说,default语句就不是必须的。在使用枚举值作为switch参数时,而且case已经列出了所有可能出现的值,此时default语句是不需要的。
但是如果有任何无法被考虑到的情况都应该加入default进行异常处理,否则这时候switch语句不会有任何输出,难以发现出错的地方在哪。
问题4: 每一个case下面可以执行多条语句吗?
答: 当然可以。
详解: 唯一的要求就是所有要执行的语句必须放在这条case分之下的break之前。
问题5: switch与第一个case之间的操作是否会被执行?
答: 永远不会被执行!
switch (1) {
printf("pre printf\n");
case 1:
printf("1\n");
break;
default:
printf("unknown \n");
break;
case 2:
printf("2\n");
break;
}
说明:
如果输入num为1则输出结果:
1
如果输入num为2则输出结果:
2
如果输入num的条件都不满足,则输出结果:
unknown
printf("pre printf\n");
永远不会被执行