break 和 switch 似乎执行所有 case 语句

4 java break switch-statement

在 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印了值4。本来我觉得应该打印2,因为我认为即使没有break语句,每段代码仍然保存在一个case语句中。现在我认为问题在于它是如何编译的。例如,我目前的信念是内部布尔值会跟踪 case 语句是否等于该值。如果是,则布尔值为真,所有 case 语句都将被视为真,直到找到中断。这是有道理的,但我仍然想知道这背后是否有其他原因,或者我的假设是否完全错误。

Imr*_*err 5

switch 工作的原因是:

switch(p){  
        case (1):
            x--;
        case (2):
            x = 2;
        case (3):
            x = 3;
        default:
            x++;
    }
Run Code Online (Sandbox Code Playgroud)

真的只是这个(基本上)的语法糖:

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++;
Run Code Online (Sandbox Code Playgroud)

Java 没有goto声明,但 C 有,这就是它的来源。所以如果p是 2,它会跳转到.L2并执行该标签后面的所有语句。