5

do-while次のループを見てみましょう。それは非常に明白であり、それについては疑問の余地はありません。

do
{
    System.out.println("Hello world");
    break;
} while(false);

これは非常に明白であり、文字列Helloworldをコンソールに表示して終了します。


さて、次のバージョンはdo-while無限ループに陥っているようですが、そうではありません。また、文字列Hello worldをコンソールに表示し、サイレントに終了します。

do
{
    System.out.println("Hello world");
    continue;
} while(false);

do-while次のようなラベルが付いたのさらに別のバージョンを見てみましょう。

label:do
{
    System.out.println("Hello world");
    continue label;
} while(false);

また、コンソールにHelloworldというメッセージが表示されて終了します。このシナリオのすべてのバージョンがある程度同じように機能することを意味しているように見えるかもしれないので、これは無限ループではありません。どのように?

4

3 に答える 3

9

このcontinueステートメントは、「次の反復のためにループ制御ロジックに進む」ことを意味します。次のループ反復を無条件に開始するという意味ではありません。

(これについてJLSを参照したい場合は、関連するセクションはJLS 14.16です。ただし、仕様のこの部分は少し複雑で、他の構造の仕様によって異なります。たとえば、さまざまなループステートメントやtry / catch /ついに。)

于 2011-12-25T15:06:34.917 に答える
4

forループの場合と同様に、aのwhile条件はdo-while、ループ本体に入る前に常にチェックされます(もちろん、最初のパススルーの後)。また、forループの場合と同様にcontinue、終了式がスキップされることはありません。

于 2011-12-25T15:05:51.213 に答える
3

マニュアルにあるように、continueは実際に続行する前にブール式をチェックしています。

continueステートメントは、for、while、またはdo-whileループの現在の反復をスキップします。ラベルのないフォームは、最も内側のループの本体の最後までスキップし、ループを制御するブール式を評価します。

詳細については、分岐セマンティクスを参照してください。

于 2011-12-25T15:07:14.497 に答える