1

このコードは何らかの理由で機能しますが、まったく意味がありません。

#include <stdio.h>

int main(void)
{
  switch(1)
    {
      case 0:
        while(1)
          {
            case 1: puts("Works"); break;
          }
    }
  return 0;
}

なぜそれが機能するのか、そしてこれにはどのようなアプリケーションがあるのか​​ を誰かが説明できますか?

4

3 に答える 3

8

ラベルは、caseで使用されるラベルとほぼ同じgotoです。1 これらの用語でコードを考える場合、それが有効であることは明らかです。つまり、switchステートメントを栄光の条件付きと見なすことができますgoto

そうは言っても、本番環境でそのようなコードを書いた人は誰でも平手打ちします。2


  1. 実際、これらは両方ともC99標準の同じ文法セクション(6.8.1)にリストされています。

  2. はい、これはDuffのデバイスとほぼ同じですが、最後に実用化されたのは数十年前です。

于 2013-03-06T18:54:42.210 に答える
5

これが機能する理由はやや直感的ではありません。ステートメントcaseのラベルはswitch通常のラベル、つまりステートメントで使用するために設計されたラベルと非常によく似ていますgoto。このようなラベルは、コードのどこにでも配置できます。

ラベルにも同じルールが適用されることがわかります。caseラベルは、対応するステートメント内のどこにでも配置できswitchます。これには、ネストされたループの本体も含まれます。

ステートメントの本体内の制御ステートメント内にラベルを配置する理由は、さらに直感的ではありませ。Duff's Deviceswitchと呼ばれる面倒に見えますが非常に直感的な構造を使用して、ループ展開を実行できることがわかります。ステートメント内の他の制御構造内にケース ラベルを埋め込むという考えを広めたのは、この構造です。switch

于 2013-03-06T18:56:48.953 に答える
4

switchステートメントは単なるラベルであるため、のラベルを介してステートメントをインターリーブできます。ここで何が起こるかです:

  • while (1);を使用して定義された無限ループがあります。
  • switch (1)ステートメントはラベルにジャンプしますcase 1:
  • ここで、"Works"が出力され、break;無限ループを終了します。
于 2013-03-06T18:56:17.517 に答える