2

考虑以下代码

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在每个 case 语句中都没有
我的疑问是,如果第一个没有中断,那么如何执行每个 case 语句,
因为x 不等于 2,那么它的执行case 2
也是如此,但我理解default一个,因为没有break程序继续执行它并执行default statement

4

9 回答 9

2

这是 C 编程语言的残余。在 C中,根据表达式的值,switcha 只不过是一点语法糖而已,因此执行只是跳转到适当的位置并从那里继续。介于两者之间的标签正是:标签。它们是跳转目标,但不会影响控制流,从编译器的角度来看,标签中没有任何内容值得在其他地方跳转(除了某处有 INTERCAL)。因此,您必须在每个不想陷入其他选择的情况下明确说明。gotocaseCOMEFROMbreak

Java 或多或少地继承了这些语义,同时避开了一些更疯狂的 C 习惯用法

另一方面,C# 更进一步,完全禁止在非空case标签上掉线。

但在我看来,这有点设计错误。默认情况下,通过在编译器中实现可能要容易得多(因为您不必goto在末尾添加 aswitch并且它与下面的实际工作方式非常吻合),但根据我的经验,还有更多意外使用 fall-through 比意外使用它会导致编程错误。

在我看来,最严重的设计错误是包含switch现代语言中所有怪异的声明。

于 2013-07-21T08:14:09.523 回答
0

由于继承自 C++ 的原因,执行自然会继续到 switch 或 break 结束。没有针对遇到的案例进行测试。

于 2013-07-21T08:12:02.750 回答
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");
}
于 2013-07-21T08:12:03.433 回答
0

switch 语句是对分支表的抽象,分支表也有隐式的fall-through,需要额外的跳转指令来避免。也阅读这个SO 答案

根据JLS 14.11

switch 语句的主体称为 switch 块。

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

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

于 2013-07-21T08:12:49.470 回答
0

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

这就是为什么 switch 比一堆链式 if 语句更可取的原因。

于 2013-07-21T08:13:15.930 回答
0

来自java 文档

break 语句是必要的,因为没有它们,switch 块中的语句就会失败:匹配 case 标签之后的所有语句都按顺序执行,无论后续 case 标签的表达式如何,直到遇到 break 语句

于 2013-07-21T08:13:51.380 回答
0

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

文档指出:

控制流继续 switch 块之后的第一条语句。break 语句是必要的,因为没有它们,switch 块中的语句就会失败:匹配 case 标签之后的所有语句都按顺序执行,无论后续 case 标签的表达式如何,直到遇到 break 语句。

于 2013-07-21T08:16:05.740 回答
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

使用休息时;语句和默认值对于每个值仅称为一个“分支”

于 2013-07-21T08:18:33.580 回答
0

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

您可以只使用 if-then-else,测试的开销会增加......这在 switch-case 中是可以避免的,但是 break 是正确执行所必需的......

于 2013-07-21T08:18:55.667 回答