在Java和Eclipse(Kempler)的最新稳定版本中,输入以下代码并执行它,假设包和类名存在:
package some_package;
public class what_the_heck {
public static void main(String[] args) {
int p = 2;
int x = 1;
switch(p){
case (1):
x--;
case (2):
x = 2;
case (3):
x = 3;
default:
x++;
}
System.out.println(x);
}
}
这打印了值4.最初,我认为它应该打印2因为我认为即使没有break语句,每段代码仍然保存在case语句中。现在我认为问题在于如何编译。例如,我目前的看法是内部布尔值跟踪case语句是否等于该值。如果是,则布尔值为true,所有case语句将被视为true ,直到找到中断为止。这是有道理的,但我仍然想知道这背后是否有其他原因,或者我的假设完全错误。
答案 0 :(得分:4)
切换工作的原因是:
switch(p){
case (1):
x--;
case (2):
x = 2;
case (3):
x = 3;
default:
x++;
}
实际上只是语法糖(基本上):
if (p == 1)
goto .L1;
else if (p == 2)
goto .L2;
else if (p == 3)
goto .L3;
else
goto .L4;
.L1:
x--;
.L2:
x = 2;
.L3:
x = 3;
.L4:
x++;
Java没有goto
语句,但C语言没有,而且它就是它的来源。因此,如果p
为2,它将跳转到.L2
并执行该标签后面的所有语句。
答案 1 :(得分:3)
当你没有放break
时,开关将执行入口点下面的所有其他情况
所以它实际执行
x = 2;
x = 3;
x++;
print(x);
System.out.println(x);
这里的Pshemo转到link to the specification of the switch statement
答案 2 :(得分:1)
如果case块中的条件为真且没有return
或break
,则无论是否为true,都将执行所有其他case块。
根据经验法则,总是在case
区块的末尾放置休息或返回,你将是90%的权利。
switch (p) {
case (1):
x--;
break;
case (2):
x = 2;
break;
case (3):
x = 3;
break;
default:
x++;
break;
}
答案 3 :(得分:0)
如果您想跳过以下所有情况,您需要在此案例块的最后添加break;
,或者也执行以下所有案例块。
看看:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html