许多答案似乎都集中在失败的能力上作为要求声明的原因。break
我相信这只是一个错误,主要是因为在设计 C 语言时,并没有太多关于如何使用这些结构的经验。
Peter Van der Linden 在他的《Expert C Programming》一书中提出了这个问题:
我们分析了 Sun C 编译器源代码,以了解使用默认失败的频率。Sun ANSI C 编译器前端有 244 个 switch 语句,每个语句平均有 7 个 case。在所有这些案例中,只有 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% 案例之一。”
我认为对于 C# 来说,在每个 case 块的末尾需要一个明确的跳转语句是个好主意(同时仍然允许堆叠多个 case 标签——只要只有一个语句块)。在 C# 中,您仍然可以让一个案例落入另一个案例 - 您只需通过使用goto
.
太糟糕了Java没有抓住机会打破C语义。