java的分支语句中,当对面情况多种疲于if else的情况下,我们大多数情况下会选择使用switch case进行判断处理不同情况。
switch结构:
switch语句由一个控制表达式和多个case组成,形如:
switch(expression){
case condition1 :
{
do something;
break;
}
case condition2 :
{
do something;
break;
}
default :
{
do something;
break;
}
}
int ex = 2;
int i = 0;
switch (ex) {
case 1:
i++;
break;
case 2:
i++;
break;
case 3:
i++;
break;
case 4:
i++;
break;
default:
break;
}
System.out.println(i);
如上代码是一个代码是正常语法书写下的switch语句,switch将ex一次匹配 conditin 1 2 3 4然后自行对应符合条件的执行体。显然结果正常输出为 i = 1;
偶然一次网上遇一代码如下:
int ex = 2;
int i = 0;
switch (ex) {
case 1:
i=i+2;
case 2:
i=i+2;
case 3:
i=i+2;
case 4:
i=i+2;
default:
i=i+10;
break;
}
System.out.println(i);
求i?
初看ex case 2 is true ,then i=i+2; result is i=2;
其实不然,对比上段switch 在每个case后只缺了个break 对程序影响应该不到,应能正确判断输出,但实际结果 i=16。
原因分析:
原因是由switch特殊的运行流程决定的,switch语句会先计算出expression表达式的值,然后拿这个值和case标签后的值进行比较,一旦符合条件遇到相等的值,程序就开始执行这个case后面对应的执行体,如果此时执行体内无break关键字且后面还有其他case标签或default标签,程序将不再对case break标签的条件进行匹配而直接运行执行体。
即switch 在case遇到条件匹配的情况后,如无break终止将不再对后续的case default进行匹配判断而直接执行执行体。