这段Java代码的含义是什么?

4

最近我写了一段类似下面这样的代码:

switch (x) {
    case a: case b: case c:
    // do something
    break;
    case d: case e: case f:
    // do something
    break;
}

后来,我写了一个类似的代码,但存在语法错误:我忘记写case关键字:

switch (x) {
    case a: b: c:
    // do something
    break;
    case d: e: f:
    // do something
    break;
}

这种语法在其他一些语言中实际上是有效的,而且switch会通过所有的值。

实际上,在这里也是有效的,因为我没有收到任何语法错误:但程序的行为是错误的,它顺利地执行了switch,只是缺少了没有case关键字的值。

为什么?第二个片段中的b; c:、e:和f:是什么意思?

它们可能是标签吗?然后,它们怎么可能在同一行上?我不理解这个奇怪的非错误背后缺少了什么?

编辑:它们确实是标签。这很不寻常,正如@Bathsheba所解释的那样,问题在于标签通常出现在一行的开头。奇怪的是Java允许这种令人困惑(在我看来)的语法,甚至没有显示警告。这可能会在长程序中造成非常混乱和奇怪的错误。

谢谢。


1
我能知道为什么我在10秒钟内得到了-2分吗?这个问题有什么问题吗?我正在尝试更深入地理解Java语法。 - Beppi's
我喜欢这个问题。它提出得很好,代码片段也很棒。 - Bathsheba
因为如果你曾经谷歌搜索“switch 语句如何工作”,你就会得到答案。基本上,你所问的问题是,为什么带有错误语法的代码没有运行。答案是:因为它具有错误的语法。 - DejaVuSansMono
不,我问的是为什么代码在错误的语法下“能够”工作。 - Beppi's
1
@Bathsheba 好奇心害死猫。好的,这个问题因为出人意料的好奇心得到了一个赞。 - DejaVuSansMono
显示剩余4条评论
1个回答

5
在第二种情况下,b:c:e:f:标签。在Java中,您可以使用break到标签,并且语言允许您在各种位置插入标签,包括您拥有的位置。
只是看到标签不从行首开始很不寻常,仅此而已。

1
标签可以在同一行和同一块中堆叠,显然。 - Beppi's
我恐怕是这样的;-( - Bathsheba
自从Java诞生以来,它就想帮助开发人员使用清晰的语法和模式,并避免常见的错误。很奇怪会发现这样一种异常的语法扭曲,它让我更想起C而不是Java :) 谢谢 - Beppi's

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接