书上的练习题,问下面程序的运行结果:
public class LX{
public static void main(String[] args){
int x=1,y=2,i=0,j=0;
switch(x){
case 1:
switch(y){
case 1:i++;break;
case 2:j++;break;
default:i++;j++;
}
case 2:
i++;j++;break;
default:i++;j++;
}
System.out.println("i="+i);
System.out.println("j="+j);
}
}
//输出结果 i=1 j=2 ,没怎么看懂?作者: 葛旭东 时间: 2012-11-15 12:28
因为case1:的语句后面没有加break,所以会继续执行case2:。
把case1换成 case 1:
switch(y){
case 1:i++;break;
case 2:j++;break;
default:i++;j++;
}break;//句末加上break试试,这是你想要的结果作者: 邵天强 时间: 2012-11-15 12:37
switch(int x){
case 1:
表达式;break;
case 2:
表达式;break;
case 3:
表达式;break;
default:
表达式;
}
而你的程序中
switch(x){
case 1:
switch(y){
case 1:i++;break;
case 2:j++;break;
default:i++;j++;
}
case 2:
i++;j++;break;
default:i++;j++;
}
case 1后没有break,它会继续往下执行,
case 1:
switch(y){
case 1:i++;break;
case 2:j++;break;
default:i++;j++;
}
中 因为y=2;所以执行case 2:j++;break;
此时i=0;j=1
然后再执行:
case 2:
i++;j++;break;
此时i=1;j=2
所以不正确,需要
case 1:
switch(y){
case 1:i++;break;
case 2:j++;break;
default:i++;j++;
};break; 作者: 金鑫 时间: 2012-11-15 12:55 本帖最后由 金鑫 于 2012-11-15 13:32 编辑
switch(x){ //因为x=1,所以进入case:1
case 1:
switch(y){ //y=2,所以case1的switch继续跳,进入case 2
case 1:i++;break;
case 2:j++;break; //程序跳入了这里,j++,所以j = 1
default:i++;j++;
}
case 2: //因为case1里没有break关键字,所以执行完case1之后,会继续执行case 2,这种现象也叫break穿透
i++;j++;break; //程序跳入这里,i++之后,i = 1; 因为在第一个case里面,j的值是1,所以这里j++, j = 2;这里有了break,程序执行完后就跳出,最终结果是i = 1, j = 2;
default:i++;j++;
}
System.out.println("i="+i);
System.out.println("j="+j);
}
}
普通switch:
switch(x){
case 1:
表达式;
break;
case 2:
表达式;
break;
case 3:
表达式;
break;
default:
表达式;
}
因为以上的case里面有break关键字,所以switch只会执行一个case中的表达式,或者执行default中的表达式。
switch穿透: 因为case中没有break,所以会一直执行表达式1,表达式2,表达式3,表达式4直到default中的break来结束switch。如果switch中没有break,那么就会把switch中所有的表达式全部执行,直到程序结束。
switch(x)
{
case 1:
表达式1;
case 2:
表达式2;
case 3:
表达式3;
default:
表达式4;
break;
}