开关没有故意自动断开?

时间:2016-03-11 07:19:46

标签: c switch-statement

在案件发生后,开关没有自动中断的事实是有意或无意的。我认为这是故意的,但我读过的一本书(专家C编程)(它已经老了)认为它是失败的。

  

也许switch语句中最大的缺点是案例不会自动中断   案件标签的行动。

那么,它是故意的吗?

4 个答案:

答案 0 :(得分:7)

这个决定最有可能是为了能够利用案件落后(语言设计中没有那么多巧合)。

鉴于在现实生活中,现在被许多人视为糟糕的编程实践,而实际案例是你真的可以用它是非常罕见的,它可能不是一个好主意,毕竟(但那是基于意见的)。

答案 1 :(得分:5)

其目的很多原因。它非常适合菜单驱动的文本界面,您可以将a置于A之上,并允许控制流通过两者。一个更复杂的例子是Duff device

send(to, from, count)
register short *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }
}

答案 2 :(得分:4)

book也说:

  

我们分析了Sun C编译器源代码   看看默认下降的频率   通过使用。太阳ANSI C   编译器前端有244个开关   声明,每个都有一个   平均7例。堕落   仅发生在所有这些案件中的3%。

     

换句话说,正常开关   行为是错误 97%的时间。   它不只是在编译器中 - 在...上   相反,在使用跌倒的地方   在这个分析中,它经常是   更频繁发生的情况   在编译器中比在其他软件中,   例如,在编译运算符时   可以有一个或两个   操作数:

switch (operator->num_of_operands) {
    case 2: process_operand( operator->operand_2);
              /* FALLTHRU */

    case 1: process_operand( operator->operand_1);
    break;
}
     

案件失败是如此广泛   被认为是有缺陷的   甚至是特别评论大会,   如上所示,告诉lint“这是   真的是其中3%的情况之一   希望失败。“

所以它看起来更像是故意这样做。

Dennis Ritchie撰写(在ACM HOPL-II中):

  

例如,从BCPL switchon语句中转义的endcase   当我们在20世纪60年代学到它时,并没有出现在语言中   所以break关键字的重载要从B和C中逃脱   转换声明归功于不同的进化而非意识   变化

答案 3 :(得分:2)

  

那么,它是故意的吗?

是的,是的。