なぜ switch ステートメントは休憩が必要なように設計されたのですか?

理由として失敗する能力に焦点を当てている回答が多いようです。 break を要求するため

C が設計されたとき、これらの構造がどのように使用されるかについての経験がほとんどなかったことが主な理由で、これは単なる間違いだったと思います。

Peter Van der Linden は、彼の著書「Expert C Programming」で主張しています。

C# が各ケース ブロックの最後に明示的な jump ステートメントを必要とするのは良い考えだったと思います (ステートメントのブロックが 1 つしかない限り、複数のケース ラベルを積み重ねることができます)。 C# では、1 つのケースを別のケースにフォールスルーさせることができます。goto を使用して次のケースにジャンプすることで、フォールスルーを明示的にする必要があります。 .

Java が C のセマンティクスから脱却する機会を利用しなかったのは残念です。


多くの点で、c は標準アセンブリ イディオムへのクリーンなインターフェイスにすぎません。ジャンプ テーブル駆動のフロー制御を記述する場合、プログラマは「制御構造」を通過するか飛び出すかを選択できます。ジャンプ アウトには明示的な命令が必要です。

したがって、c は同じことを行います...


ダフのデバイスを実装するには、明らかに:

dsend(to, from, count)
char *to, *from;
int count;
{
    int 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);
    }
}