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 行実行する必要があり、ステートメントは少なくとも実行し続ける必要があります。空のステートメントに到達します。do
do
while
では、なぜブレースを使用するのでしょうか。
この構文でいくつかのシナリオを見てみましょう。do...while
1 つのステートメントを含むステートメントはどうでしょうか。
do something();
while(booleanValue();
わかりました、ここでは新しいことは何もありません。do...while
3 つのステートメントを含むステートメントについてはどうでしょうか。
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構文として含めても問題ないことに同意する人はいますか、それともこれができないという明確な理由がありますか?