语言为什么不对switch语句使用显式的穿透?


17

我在看为什么我们要用breakswitch,这使我想知道为什么某些语言(例如PHP和JavaScript)允许隐式掉线,而没有支持(AFAIK)的显式掉线。

这并不是continue完全需要的,而是需要创建一个新的关键字,并且可以解决任何有关作者是否打算通过案子的模棱两可的问题。

当前支持的形式是:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

而将其写为:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

为了这个问题的目的,让我们忽略掉线是否是一种好的编码风格的问题。

是否存在允许掉线并使其明确的语言?

是否有历史原因导致switch隐性掉线而不是显性掉线?


4
C#要求您对明确goto case,因此您的问题的前提有点错误。
pdr

1
@pdr,我非常明确地询问是否有任何语言已经支持穿透,我goto case在C#中还不知道。
zzzzBov 2012年

是的,很抱歉,我想念您的问题分为两个部分。不幸的是,按原样来说,我投票结束,因为这非常接近民意调查问题。会有很多正确答案。
pdr 2012年

C#还允许您使多个标签共享同一个语句列表,从而消除了某些需要经过的情况。其余的,goto case如pdr所述。
Brian

Answers:


20

这主要是历史性的,大多数语言只是复制了C所做的事情。

C之所以这样做,是因为C的创建者希望将switch语句轻松优化为跳转表。这也是C将switch语句限制为整数值的原因。

在跳转表中,程序将根据表达式计算要跳转到的位置。程序将跳至该点,然后从该点继续执行。如果要跳过表的其余部分,则必须包括跳至表的末尾。C使用显式break语句,因此与该构造有直接对应关系。


7
稍微提一下,Peter van der Linden在他的《专家C编程》一书中提到,当他在Sun的C编译器上工作时,包含了大约97%的转换案例break,只有不到3%的转换失败。 。然后,他以该示例为例,默认的掉落行为是违反直觉的,并且最好不要反向使用(使用关键字指示明确的掉落)。哦,这本书真的也很好地解释了C的其他特性,其中有些可以在C ++甚至C#和Java中找到!它们全部植根于B和BCPL。:)
zxcdw 2012年

3
有些编程语言明确指出了失败的地方,例如c#(msdn.microsoft.com/zh-cn/library/06tc147t ( v=vs.71 ) .aspx)。另一方面,在c#中中断也是显式的。
linkerro

@zxcdw:太可惜了,没有一点小鸟可以回到过去,建议标有的标签(case第一个标签除外)应自动加上前缀break,但标有标签的标签+case(或其他一些这样的标签)则不应添加。对于编译器来说,这将很容易处理,并允许本安排的语义优势,同时消除许多代码行。
超级猫

7

Go允许使用fallthrough关键字进行显式掉线(break是隐式的,但可能是显式的):

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

这是有效用法语言规范的相关内容

我不认为您可以用来goto处理特定案件,但可以在案件中打上标签并使用goto类似的标签。

另外,Go允许您在开关中使用二进制表达式,字符串或类型作为case语句。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.