C 开关不存在';自动中断是故意的吗?

C 开关不存在';自动中断是故意的吗?,c,switch-statement,C,Switch Statement,事实上,开关不会在发生故障后自动断开,这是有意或无意的。我认为这是故意的,但我一直在读的一本书(专家C编程)(旧的)认为它是失败的。 switch语句中最大的缺陷可能是,案例不会在事件发生后自动中断 案例标签的操作 那么,这是故意的吗 那么,这是故意的吗 是的,是的。他们还说: 我们分析了sunc编译器的源代码 查看默认值下降的频率 使用的是通过。太阳报 编译器前端具有244开关 语句,每个语句都有一个 平均7例。落空 发生在所有这些情况中只有3% 换句话说,正常开关 97%的时候行为是错误的。

事实上,开关不会在发生故障后自动断开,这是有意或无意的。我认为这是故意的,但我一直在读的一本书(专家C编程)(旧的)认为它是失败的。 switch语句中最大的缺陷可能是,案例不会在事件发生后自动中断 案例标签的操作

那么,这是故意的吗

那么,这是故意的吗

是的,是的。

他们还说:

我们分析了sunc编译器的源代码 查看默认值下降的频率 使用的是通过。太阳报 编译器前端具有244开关 语句,每个语句都有一个 平均7例。落空 发生在所有这些情况中只有3%

换句话说,正常开关 97%的时候行为是错误的。 它不只是在编译器中,而是在 相反,如果使用了fall-through 在这种分析中,它通常是针对 更频繁发生的情况 在编译器中,而不是在其他软件中, 例如,在编译运算符时 可以有一个或两个 操作数:

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

    case 1: process_operand( operator->operand_1);
    break;
}
这个案子的失败是如此广泛 被认为是有缺陷的 即使是一个特别的评论大会, 如上所示,这告诉lint“这是 真的是3%的案例之一 希望失败。”

所以这看起来更像是故意的

丹尼斯·里奇(在ACM HOPL-II中)写道:

例如,从BCPL switchon语句中转义的endcase 我们在20世纪60年代学习该语言时,它并不存在于该语言中 所以break关键字的重载要从B和C中转义 转换语句是发散进化而非有意识进化的结果 改变


很多原因都是故意的。它非常适合于菜单驱动的文本界面,您可以将
a
放在
a
的正上方,并允许控制流通过两者。一个更复杂的例子是


这个决定很可能是为了能够利用案例的失败而做出的(在语言设计中没有那么多巧合)


考虑到现实生活中,失败现在被很多人认为是糟糕的编程实践,而且你真正可以故意使用它的实际案例非常罕见,毕竟这可能不是一个好主意(但这是基于观点的)。

听起来很有道理。你有没有参考资料来支持这一点?你真的希望如此重要的设计细节是偶然出现的吗@juanchopanzaBut你是对的,这不是一个非常有用的答案,但这可能是因为这个问题@juanchopanzaIt是一个选择。有些人不同意这个选择,例如,编程语言做出了相反的选择。我的问题是,switch(在C中)的这个特性是否是故意的。它不是基于意见的。@SimoneBonato但是你选择了一个看起来像是意见的答案。@juanchopanza
这也许不是一个好主意,毕竟(但这是基于意见的)。
是意见。“这个决定很可能是做出的…”这里没有事实。是的,但请记住C可能是所有高级编程语言中最低的,所以罕见的病例在C中并不罕见。在我的编程生涯中,我曾经写过无数的switch语句——可能只有不到0.5%的语句能够很好地利用fall-through。但是,在涉及到故障的案例中,大约99.9%只是导致难以发现的错误的原因。Fall-through是一个非常特殊的情况,可能应该有自己的关键字来启用它,而不是默认的。是的,我同意你的看法。我的声明是针对通用C语言的,而不是针对这个特定功能本身:)
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);
    }
}