一直以为switch语句的知识点是so easy,直到有一天笔试考了一道不知哪朵奇葩写的程序,把default写在了某一个case前面,然后问题就出来了,看下面的代码:

 1 void main()
 2 { 
 3     char ch='/0';
 4     int v1=1,v2=1;
 5     do{
 6         switch(ch){
 7         case 'a':
 8         case 'b':
 9         case 'h':v1++;
10         default:v1++;
11         case 'n':v2++;
12         }
13         
14         
15     }while((ch=getchar())!=('#'));
16         cout<<"V1="<<v1<<",  "<<"V2="<<v2;
17 }

如果输入n#,输出结果是什么呢?

过程是这样的:第一次执行do时,ch='/0',从default开始执行,因为没有break,所以case'n'也执行了,这时v1=2,v2=2;然后因为读入有'n'!='#'所以再次执行do中的switch,这次从case‘n’开始执行,所以执行完v1=2;v2=3.然后再执行while中的比较,结束。

再换一种情况,若输入的是h#呢?结果是

执行过程是这样的:第一次执行do时,ch='/0',从default开始执行,因为没有break,所以case'n'也执行了,这时v1=2,v2=2;然后因为读入有'h'!='#'所以再次执行do中的switch,这次从case‘h’开始执行,再执行default以及case'n'中的分支,所以执行完v1=4;v2=3.然后再执行while中的比较,结束。

结论,switch结构中,若各分支后没有break,则会从符合条件的那个分支开始执行,直到所有语句都执行完。尤其是default后若没有break,若default后还有case语句,则该case也会执行。