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

时间:2013-11-05 19:02:23

标签: java switch-statement break

在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 ,直到找到中断为止。这是有道理的,但我仍然想知道这背后是否有其他原因,或者我的假设完全错误。

4 个答案:

答案 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块中的条件为真且没有returnbreak,则无论是否为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