多くの回答は、ステートメントを要求する理由として失敗する能力に焦点を当てているようです.break
C が設計されたとき、これらの構造がどのように使用されるかについての経験がほとんどなかったためです。
Peter Van der Linden は、著書「Expert C Programming」で次のように説明しています。
Sun C コンパイラのソースを分析して、デフォルトのフォールスルーがどのくらいの頻度で使用されたかを確認しました。Sun ANSI C コンパイラのフロント エンドには 244 の switch ステートメントがあり、各ステートメントには平均 7 つのケースがあります。フォールスルーは、これらすべてのケースのわずか 3% で発生します。
つまり、通常のスイッチの動作は97% の確率で間違っています。これはコンパイラだけではありません。反対に、この分析でフォール スルーが使用されたのは、他のソフトウェアよりもコンパイラでより頻繁に発生する状況でした。たとえば、1 つまたは 2 つのオペランドを持つことができる演算子をコンパイルする場合です。 :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
ケース フォール スルーは欠陥として広く認識されているため、上に示した特別なコメント規則さえあり、lint に「これは実際にはフォール スルーが必要な 3% のケースの 1 つです」と伝えます。
C# が各ケース ブロックの最後に明示的な jump ステートメントを必要とするのは良い考えだったと思います (ステートメントのブロックが 1 つしかない限り、複数のケース ラベルを積み重ねることができます)。C# では、1 つのケースを別のケースにフォールスルーさせることができますgoto
。
Java が C のセマンティクスから脱却する機会を利用しなかったのは残念です。