3

次のコードを検討してください。

myBusiness business = new myBusiness();
business.DoWork(); ; ; ; ; ; ;

複数のセミコロンを使用できるのはなぜですか? コンパイラのバグですか?

4

6 に答える 6

29

これは、セミコロンを単独で使用すると、空のステートメントを表すためです。

ドキュメントには次のように記載されています。

空のステートメントは、1 つのセミコロンで構成されます。これは何もせず、ステートメントが必要であるがアクションを実行する必要がない場所で使用できます。

そして、次の例を提供します。

void ProcessMessages()
{
    while (ProcessMessage())
        ; // Statement needed here.
}

もちろん、空のステートメントをいくつでも連続して実行できますが、何も起こりません。

于 2013-07-20T12:22:45.567 に答える
3

空のステートメントは、すべての C 派生言語で有効です。最も一般的な慣用的な使用法は、for ステートメントです。たとえば、次のようになります。

for (; ; )
{
}

また

while (Method())
   ;

また

void F() {
   //...
   if (done) goto exit;
   //...
   exit: ;
}

また

if (true)
 {
      ;
 }

また

if (true)
    ;

すべてのステートメントは有効です。

于 2013-07-20T12:42:40.613 に答える
1

単独で使用されるセミコロンは、空のステートメントを表します。

また、ここの回答を参照してください - Legal は、完全に合法である理由の詳細な説明とともに複数のセミコロンを許可します。マクロについてはBinary Worrierの回答を参照してください。

その投稿から-

マクロを最初の定義とは異なるものに再定義することも、まったく存在しないように再定義することもできます。

アサーション マクロ#define ASSERT(c) if(!c) throw new AssertionFailedException()を指定すると、コードに ASSERT ステートメントを散らかすことができます。

void Foo(int x) {
    int y = x + 2;
    ASSERT(y != 0);
   int z = x / y;
    . . . .
}

ここで、デバッグ ビルドでのみアサートが必要で、リリース ビルドではアサートが必要ではないことを考慮してください。リリースでは、マクロを empty に再定義します(literally #define ASSERT)。Foo がリリース ビルドのためにコンパイラに行くと、次のようになります。

void Foo(int x) {
    int y = x + 2;
    ;
   int z = x / y;
    . . . .
}

ASSERT があった場所に空のステートメントがあります。そこにステートメントがある場合とない場合があるため (ビルド構成によって異なります)、コンパイラーは空のステートメントを処理できる必要があります。

C マクロのようなものがない C# でこの規則が保持された理由はわかりませんが、おそらく害がほとんどまたはまったくないためです。

複数だと思います。コードの解析を開始する前にコンパイラによって省略されるため、到達不能 ; コンパイラによって無視されます。

于 2013-07-20T12:35:35.853 に答える
1

;は、このステートメントが終了したことをコンパイラーに伝える行ターミネーターにすぎません。1 行で複数を使用している場合;、コンパイラはそれらを複数のステートメントと見なします。

于 2013-07-20T12:25:35.310 に答える