了解开关行为

时间:2013-07-21 08:10:24

标签: java switch-statement

考虑以下代码

int x = 1
switch(x) {
    case 1:
        System.out.println("1");
    case 2:
        System.out.println("2");
    default:
        System.out.println("no value found");
 }

打印

1
2
no value found

正如预期的那样,因为每个案例陈述中都没有break 我怀疑的是,如果第一个案例中没有中断,执行如何处理每个案例陈述 因为 x不等于2,所以它的执行case 2
但我理解default一个因为没有break程序继续执行并执行default statement

9 个答案:

答案 0 :(得分:2)

这是C编程语言的残余。在C switch中,根据表达式值,goto上的语法糖略多于一点语法糖,因此执行只是跳转到适当的case并从那里继续。中间的标签正是:标签。它们是跳转目标,但不会影响控制流,否则从编译器的角度来看,标签中没有任何内容可以在其他地方跳转(除了在某处有INTERCAL的COMEFROM)。因此,在希望落入其他选项的每个案例之后,您必须明确break

Java在回避某些of the crazier C idioms时会或多或少地继承这些语义。

另一方面,C#通过完全禁止非空case标签的下降而更进一步。

在我看来,这有点像设计错误。默认情况下,可以更容易地在编译器中实现更改(因为您不必在goto的末尾添加switch,并且它与下面的实际工作方式非常吻合)但是根据我的经验,不小心使用掉落而不是意外地使用它时会出现更多的编程错误。

我眼中最严重的设计错误包括switch语句及其在现代语言中的奇怪现象。

答案 1 :(得分:0)

由于从C ++继承的原因,执行自然会一直持续到切换结束或中断。遇到案件时没有对案件进行测试。

答案 2 :(得分:0)

switch即将失败。除非您需要,否则您需要在每个下一个break之前添加case

switch (x) {
    case 1:
        System.out.println("1");
        break;
    case 2:
        System.out.println("2");
        break;
    default:
        System.out.println("no value found");
}

答案 3 :(得分:0)

switch语句是branch table的抽象,并且分支表也有一个隐式的直通,需要一个额外的跳转指令来避免它。请阅读此SO answer

根据JLS 14.11

  

switch语句的主体称为switch block。

     

如果其中一个case常量等于表达式的值,那么我们说案例匹配, switch block 中匹配的case标签之后的所有语句(如果有的话)都是按顺序执行。

     

如果所有这些语句正常完成,或者在匹配的case标签之后没有语句,则整个switch语句正常完成。

答案 4 :(得分:0)

这与它的编译和优化方式有关。

这就是为什么一个开关比一堆链式if语句更可取。

答案 5 :(得分:0)

来自java doc

  

break语句是必要的,因为没有它们,语句就可以了   switch blocks fall through:匹配大小写后的所有语句   标签按顺序执行,无论表达式如何   后续案例标签,直到遇到中断语句

答案 6 :(得分:0)

switch语句与if-then-else语句不同。 switch语句有多个执行路径。

Documentation州:

  

控制流继续切换后的第一个语句   块。 break语句是必要的,因为没有它们,   switch块中的语句通过:所有语句后面的   匹配的案例标签按顺序执行,无论如何   后续case标签的表达式,直到break语句为止   遇到。

答案 7 :(得分:0)

这是正确的行为。 “默认”并不意味着所有可能的答案。这意味着没有这些案例的所有答案。

int x=1
switch(x)
    {
        default:
             System.out.println("no value found");
        case 1:
            System.out.println("1");
        case 2:
            System.out.println("2");
    }

将打印

1
2

不会打印

no value found
1
2

使用休息时;语句和默认值每个值只有一个“分支”

答案 8 :(得分:0)

每个break语句都会终止封闭的switch语句。匹配的case标签之后的所有语句都按顺序执行,而不管后续case标签的表达式如何,直到遇到break语句。

你可以使用 if-then-else,测试的开销是增加 ...,这在switch-case中是可以避免的,但是正确执行需要中断...