公司的面试题里有一道题,代码大致如下
//片段A
char n = 'a';
switch(n++)
{
default :
printf("error");
break;
case 'a':
printf("a");
case 'b':
printf("b");
}
这个题首先是看 ++n 和 n++,这个基本都没疑问。不过来应聘的人认为这段的输出应该是aberror,于是今天对这个进行一个总结。
实际上自行调试一下可知,C和C++(我没有仔细验证编译器版本是否会有影响)对于片段A的输出是ab,而下面的片段B输出的结果是aberror
//片段B
char n = 'a';
switch(n++)
{
case 'a':
printf("a");
case 'b':
printf("b");
default :
printf("error");
break;
}
还可以有一种新的版本,片段C,输出的是aerrorb
//片段C
char n = 'a';
switch(n++)
{
case 'a':
printf("a");
default :
printf("error");
case 'b':
printf("b");
}
综上所述,我们要先明确switch语句里case和default的排列顺序是会影响输出的。
这个其实也很好理解,参考下面这段例子有助于你理解。
int n = 1;
switch(n)
{
case 1:
cout>>1;
case 2:
cout>>2;
case 3:
cout>>3;
}
//输出1.2.3
int n = 1;
switch(n)
{
case 1:
cout>>1;
case 3:
cout>>3;
case 2:
cout>>2;
}
//输出1.3.2
所以今天我们大概推测了一下,编译器实际编译switch语句之后最终的执行情况。
程序并不是判断一个case执行一次具体内容,而是在最初就判断完了所有的case,找到符合switch(x)中x的case的位置,然后开始向后继续执行,直到遇到break退出或者走到switch语句最后。
个人感觉,这玩意好像可以类比为goto,每个case看成一个goto的位置,switch(x)就是选择goto x,如果没有x则goto default。switch不是循环,他只从自己找到的位置开始顺序执行到语句末尾,除非遇到break直接退出语句。
以上内容仅通过编程验证,没有在源码层面去C/C++的库函数中寻找switch相关定义进行验证。