C语言中的switch(i)语句,是按照后面几个case语句的顺序,从前往后依次查找对应的i值,并从查到的那一句开始执行后面所有的语句(包括case),除非碰到一个break命令,后面的语句就不会被执行了。
你发的程序中,没有一个break,所以会全部执行。具体是:
循环前a的值为0,循环是从i=1到4执行循环体(i=5时结束循环):
当i=1时,匹配case1,执行从case1开始的3个语句,a先+3再+5变成0+3+5=8;
当i=2时,匹配case2,执行从case2开始的两个语句,a也是先+3再+5变成8+3+5=16;
当i=3时,匹配case3,执行从case3开始的4个语句,a先+2+3再+5变成16+2+3+5=26;
当i=4时,匹配case4,找不到,所以匹配default语句,执行这一句,a=26+5=31。
所以,a的最后结果是31。
想要程序只执行匹配的那一句,而不要执行后面的语句,则必须在每一个case语句的最后,都增加一个“default;”命令。如本例修改下面几句:
case 0:break;
case 3:a+=2;break;
case 1:break;
case 2:a+=3;
default:a+=5;(本句不改)
这样修改以后,a的运行结果是10。
因为case语句中少了break语句,所以每个case都会执行到default才结束,执行过程是这样的,
开始for循环a=0
当i==1时,case 1执行,case 2执行a=0+3,default执行a=3+5,a=8
当i==2时,case 2执行a=8+3=11,default执行a=11+5=16
当i==3时,case 3执行a=16+2=18,case 1执行,case 2执行a=18+3=21,default执行a=21+5=26
当i==4时,default执行a=26+5=31
当i==5时,退出for循环,打印a的值31.