多くの回答は、陳述を要求する理由として、抜け落ちる能力に焦点を当てているようですbreak
。
それは単にCが設計されたときに、これらの構成体がどのように使用されるかについてほとんど経験がなかったために、それは単に間違いであったと思います。
ピーター・ファン・デル・リンデンは、彼の著書「エキスパートCプログラミング」でそのことを述べています。
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#では、各caseブロックの最後に明示的なジャンプステートメントを必要とするのは良い考えだと思います(ただし、ステートメントのブロックが1つしかない限り、複数のcaseラベルをスタックできます)。C#では、1つのケースを別のケースにフォールスルーすることができます-を使用して次のケースにジャンプして、フォールスルーを明示的にする必要がありgoto
ます。
JavaがCのセマンティクスから脱却する機会を得なかったのは残念です。