在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语句等于该值。如果是这样,那么布尔值为真,并且所有case语句将被视为真,直到找到一个break。这是有道理的,但我仍然想知道背后是否还有其他原因,或者我的假设完全错误。
switch
的这种从 C 继承而来的 fall through 行为确实有点违反直觉。 - Henry