8

このコードを実行すると、どのような動作が期待できますか?

do while(testA) {

    // do stuff

} while(testB);

次のように動作しますか?

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

または:

if(testA) {
    do {
        // do stuff
    } while(testA && testB);
}

それともまったく予想外のことですか?

私はこれがかなり曖昧だと思うので、そしてこのトピックを検索している他の人々のために、私がそれをテストするのが面倒だからではなく、この質問をします。

4

6 に答える 6

7

これは最初のブロックに相当します。

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

これを解析するときのJava文法の関連部分は次のとおりです。

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

Javaコンパイラがこれを。として解析することがわかりますdo <WhileStatement> while ( Expression ) ;。これが、作成したコードを解析するための唯一の有効な方法です。

この構成を解析するための特別なルールはないことに注意してください。do-whileループの記述方法が異常であるため、人間が読み取るのが混乱するだけです。通常の使用法では、do-whileはdo { ... } while、明示的な中括弧の場合と同様に常に記述されます。

于 2010-03-12T17:37:25.477 に答える
3

それは確かに機能しますが、動作はテストしている条件によって異なります。例:このコード:

  int i = 2;
  int j = 4;
  do while(j > 0) {
       i--; j--;
       System.out.println("i:" + i + " j:" + j);
 } while(i > 0);

出力:

i:1 j:3
i:0 j:2
i:-1 j:1
i:-2 j:0

したがって、次のように機能します。

while(j>0) {

}

一方、変数名を交換することにより:

do while(i > 0) {
    //.. same as above
 } while(j > 0);

出力は次のとおりです。

i:1 j:3
i:0 j:2

最初のケース(つまり、最初のwhileが考慮される)と同じように動作するように見えますが、ここでは、アプリケーションは終了していません!


要約:もう満たされていないとき
、また満たされていないとき、コードは通常のループのように機能します。ただし、が満たされなくなったときに、がまだ満たされている場合、ループはそれ以上実行されず、スクリプトは終了しません。これは、「外部」ループの条件をループ内で変更する必要がある場合にのみ適用されます。testAtestBwhile(testA){}
testAtestB

更新:そして他の答えを読んだ後、私はこれがまさにネストされたループdo-whileの 振る舞いであることに気づきました。 とにかく、学んだ教訓:混乱する可能性があるため、この種の構文は使用しないでください;)while

于 2010-03-12T17:41:16.497 に答える
1

答えは#1です。が満たされている限りループを継続しますが、満たされていないtestB場合はコードを実行しtestAません。

于 2010-03-12T17:29:00.540 に答える
1

do {} while();」は1つの構成要素であり、「while(){}」は別の構成要素です。

「」のようなものはありませんdo while。誤ってそれらをネストし、{}が単一の命令に対してオプションであるという事実を利用しています。

言い換えれば、これは合法的な構文です。

do System.out.println("Hello World") while (true);

また、ifステートメントの場合と同様に、ブロックは単一のステートメントとして扱われます。

つまり、最初に考えられる答えは正しいものです。ここで、「 」は外側の「 」while(){}の内側にあるブラケットのない単一のものです。do {} while();

于 2010-03-12T17:30:41.163 に答える
1

それは次のように動作します

do {
    while(testA) { 
        // stuff
    }
} while(testB);

したがって、そのコードブロックは次のように解析されます。

testBがtrueのときに{コードのブロック}を実行します。ここで、{コードのブロック}は内部のwhileです。

そのようなコードを書くことは確かに少し珍しいです:)

于 2010-03-12T17:36:11.033 に答える
0

このコードは合法ではないと思います。

do while(testA) {

        // do stuff

    } while(testB);
于 2010-03-12T17:36:14.547 に答える