9

私の科学的な Java の実験によると、int x = 0;は と同等int x = 0;;ですint x = 0;;;;;;;;;;;;;;;

  1. Java がこれを許可するのはなぜですか? 実用的なアプリケーションはありますか?
  2. これらはそれぞれ単なる空のステートメントですか? 実行時に実際に余分な処理時間を取っていますか? (私はそれらが最適化されているだけだと思いますか?)
  3. 他の言語はこれを行いますか? Javaの多くのものと同様に、Cから継承されたものだと思います。これは本当ですか?
4

4 に答える 4

21

余分なセミコロンは空のステートメントとして扱われます。空のステートメントは何もしないので、Java はそれについて文句を言いません。

于 2012-05-08T02:27:16.580 に答える
18

Jake King が書いているように、ループ内で何もしない空のステートメントを作成できます。

while (condition);

しかし、それを明確にするために、あなたは書くでしょう

while (condition)
    ;

またはさらに良い:

while (condition)
/** intentionally empty */
    ;

またはさらに良いことに、Michael Kjörling がコメントで指摘したように、

while (condition)
{
    /** intentionally empty */
}

多くの場合、無限ループの for ステートメントで見られます。

for (;;)

または空のステートメントを 1 つだけ

for (start;;) 
for (;cond;) 
for (;;end) 

あなたができるもう一つのことは、プログラムを書くことです。

public class Empty
{
    public static void main (String args[])
    {
        System.out.println ("Just semicolons");;
    }
}

それをコンパイルし、バイトコードのサイズのリストを実行し(同一)、バイトコードでmd5sumを実行します(同一)。

そのため、セマンティクスが変更されていない場合、少なくとも 1.6-Oracle コンパイラについては、明らかに最適化されていると言えます。

于 2012-05-08T02:38:48.370 に答える
7

はい、何もしない空のステートメントです。それらはコンパイラによって最適化されますが、場合によっては、この空のステートメントが実際に何かを実行し、空の中かっこのセット ( {}) と同じことを実行します。これらは C 構文から継承されていますが、Java ではほとんど使用されません。C では、次のようなことをすると便利な場合がありました。

while (condition);

これは false になるまでループしcondition、コードの進行を妨げます。ただし、これは最近のコードでは推奨されておらず、Java で実際に使用するべきではありません。ただし、空のステートメントステートメントとしてカウントされますが、役に立たないため、次のように構成します。

if (condition);
    doSomething();

....やや不可解な結果になる可能性があります。ステートメントはメソッドではなく空のifステートメントを呼び出すため、メソッドは常に呼び出されます。心に留めておくべき注意事項です。

于 2012-05-08T02:30:57.513 に答える
0

注意すべきことの 1 つは、次のようなことを行う場合です。

public int foo()
{
    return(0);;
}

return の後に空のステートメントがあるため、コンパイラは到達不能ステートメントについて不平を言うでしょう/かもしれません。少なくとも Oracle の 1.6 SDK ではそうです。

于 2012-05-12T16:51:58.360 に答える