1

Java で別のdo ... whileループを作成しているときに、その構文について考え始めました。典型的なプログラマーは次のように書きます。

do {
  somethng();
}while(booleanValue);

ただし、Java には、ループ内に 1 行しかない場合にプログラマが中括弧を削除できるようにすることで、これを圧縮する組み込みの方法があります (これは Java 式の典型です)。

do
  something();
while(booleanValue);

これは次のように考えて書くことができます。

do something();
while(booleanValue);

またはとしても

do;
while(booleanValue);

これは非常に興味深いです。これは、2 行にわたって読み取って実行する必要がある Java ステートメントであること、つまり、行が実行された後は、do行が実行されるまで操作が完了しないことに注意を促しwhileました。他の式は 1 行だけであることを思い出してください。

if(booleanValue) something();
while(booleanValue) something();
for(Object declaration; booleanValue; operation()) something();
for(Object declaration : iterableObject) something();
throw throwableObject;
return anyObject;
switch(integer) {}
//case is excluded because it operates a lot more like a goto operation than a statement

そこで私は、これがなぜなのかではなく、このステートメントをもう少し圧縮する方法について考え始めました。

;「行」がセミコロン ( ) で終了するか、中括弧 ( {and ) で囲まれているものであると仮定すると、次}知識でこれに進みましょう:ステートメントは必ず 2 行実行する必要がありステートメントは少なくとも実行し続ける必要があります。空のステートメントに到達しますdodowhile

では、なぜブレースを使用するのでしょうか。

この構文でいくつかのシナリオを見てみましょう。do...while1 つのステートメントを含むステートメントはどうでしょうか。

do something();
while(booleanValue();

わかりました、ここでは新しいことは何もありません。do...while3 つのステートメントを含むステートメントについてはどうでしょうか。

do
  statement1();
  statement2();
  statement3();
while(booleanValue);

ここで、Java はそれがdoステートメントであることを認識し、2 行目、3 行目、および 4 行目を実行してから、空のwhileステートメントを確認します。この時点で、ループを終了し、式を評価し、場合によってはループに戻るかループを終了する準備ができていることがわかりますdo

あなたがそれを壊すと思うかもしれない何かはどうですか。ネストされたwhileループ:

do
  statement1();
  while(booleanValue1)
    statement2();
while(booleanValue2);

ここで、Java はそれがdoステートメントであることを認識して入力し、2 行目を通常どおり実行します。の行3で、それがwhileステートメントであることがわかります。この時点で、これがループの終わりかどうかを判断する必要があります。ステートメントを検査し、whileそれが空ではないこと、したがってdoループの終わりではないことを発見します。ステートメントに入り、whileそれがなくなるまで 3 行目と 4 行目をループします。次に、別のwhileステートメントを確認し、検査すると、それが空であることがわかり、したがって、doステートメントが終了します。それを評価し、2 行目に戻る場合と戻らない場合がありますが、今は気にしません。

しかし、スプースター、それは確かに計算量が多いようですね! それによって JVM の速度が低下することはありませんか?

必ずしも!これはすべてコンパイル時に行うことができます。これは、Java が上記のステートメントが空かどうかを判断するのと同じです (たとえば、コンパイルしようとするwhile(true);と、次の行がエラー " unreachable statement" でコンパイルされます)。

だから、よく似ている

for(Object declaration : iterableObject)
  somethingInvolving(declaration);

にコンパイルされます

Iterator<Object> i = iterableObject.iterator();
while(i.hasNext())
{
  Object declaration = i.next();
  somethingInvolving(declaration);
}

それから

do
  statement1();
  while(booleanValue1)
    statement2();
while(booleanValue2);

にコンパイルできます

do
{
  statement1();
  while(booleanValue1)
  {
    statement2();
  }
}
while(booleanValue2);

しかし、Supuhstar、Java はインデントを気にしません。あなたのものはインデントを付けて書くことができますか、それともインデントなしで書くことができますか?

そうです!コンパイラは簡単にコンパイルできます

do
  statement1();
  while(booleanValue1)
    statement2();
while(booleanValue2);

そうなるように

do statement1(); while(booleanValue1) statement2(); while(booleanValue2);

これらは両方ともまったく同じことを行います。

これをJava構文として含めても問題ないことに同意する人はいますか、それともこれができないという明確な理由がありますか?

4

3 に答える 3

3

このコードについて考えてみてください

    if(true)
        if(false)
            System.out.println("x");
    else
        System.out.println("y");

「y」を出力します。ときどき、ブレースなしでは人間にとって混乱しすぎます。

于 2012-10-10T23:11:37.157 に答える
2

この特定のステートメントは、私を少し混乱させました。

while ステートメントを調べて、それが空ではないこと、つまり do ループの終わりではないことを発見します。

「空ではない」とはどういう意味ですか?while ループは「空」にすることができます。

do
  statement1();
while(booleanValue1);
while(booleanValue2);

最初の while-loop が 2 番目の代わりに do-while を閉じるとしても、それはあなたの計画の下では有効です。

そうは言っても、あなたが提案している文法はあいまいではないと思います....しかし、言語設計者はJavaをよりクリーンまたはより簡潔な言語。

冗長性は Java 哲学の基本的な部分であるとさえ言えます。コンパイラーが推測または許可できることはたくさんありますが、そうではありません。幸いなことに、Scala のように、より簡潔で表現力豊かなコードを記述できる最新の言語が数多くあります。

于 2012-10-10T23:07:08.393 に答える