一直以为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也会执行。