在案件发生后,开关没有自动中断的事实是有意或无意的。我认为这是故意的,但我读过的一本书(专家C编程)(它已经老了)认为它是失败的。
也许switch语句中最大的缺点是案例不会自动中断 案件标签的行动。
那么,它是故意的吗?
答案 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)
那么,它是故意的吗?
是的,是的。