Frage

, welches Verhalten kann ich erwarten, wenn ich diesen Code ausführen:

do while(testA) {

    // do stuff

} while(testB);

Wird es sich verhalten wie:

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

Oder:

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

Oder etwas völlig Unerwartetes?

Ich stelle diese Frage, weil ich denke, das ist ganz eindeutig ist, und für andere Menschen zu diesem Thema suchen, nicht , weil ich faul bin um es zu testen.

War es hilfreich?

Lösung

Es ist äquivalent zu Ihrem ersten Block:

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

Die relevanten Teile der Java Grammatik beim Parsen diese sind:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

Sie sehen, dass die Java-Compiler dies als do <WhileStatement> while ( Expression ) ; analysieren werden. Das ist der einzig gültige Weg, um den Code zu analysieren, dass Sie geschrieben hat.

Beachten Sie, dass es keine spezielle Regel hat dieses Konstrukt zu analysieren. Es endet nur bis verwirrend sein für einen Menschen aufgrund der ungewöhnlichen Art und Weise zu lesen, die do-while-Schleife geschrieben wird. Im normalen Sprachgebrauch do-while immer als do { ... } while mit expliziten geschweiften Klammern geschrieben wird.

Andere Tipps

Es funktioniert zwar, aber das Verhalten hängt davon ab, welche Bedingungen Ihres testen. Z.B. dieser Code:

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

Ausgänge:

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

So funktioniert es wie:

while(j>0) {

}

Die durch die Variablennamen Austausch:

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

Die Ausgabe lautet:

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

Es sieht aus wie es die gleichen wie im ersten Fall verhält (das heißt die erste, während betrachtet), aber hier, die Anwendung beendet nicht!


Zusammenfassung:
Zu dem Zeitpunkt, testA ist nicht zufrieden mehr und testB ist auch nicht zufrieden , der Code funktioniert wie eine normale while(testA){} Schleife.
Aber: Wenn zu dem Zeitpunkt, wenn testA ist nicht mehr erfüllt , testB ist nach wie vor erfüllt , die Schleife ist nicht mehr und das Skript nicht abschließend ausgeführt. Dies gilt nur dann, wenn der Zustand der „äußeren“ Schleife Bedürfnisse innerhalb der Schleife geändert werden.

Update: Und nachdem andere Antwort zu lesen, wird mir klar, dass dies genau das Verhalten der verschachtelten do-while -. while Schleife
Wie auch immer, Lektion gelernt: Verwenden Sie diese Art von Syntax nicht, weil es Sie verwirren;)

Es verhält sich wie

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

, dass Codeblock So wird auf diese Weise analysiert:

do {einen Code-Block} während TestB wahr ist. Wo {a} Code-Block ist die innere while.

Es ist sicherlich ein wenig ungewöhnlich, dass Code schreiben wie folgt aus:)

Die Antwort ist # 1. Es wird so lange Schleife weiterhin als testB erfüllt ist, aber es wird den Code nicht ausgeführt, wenn testA erfüllt ist nicht.

"do {} while();" ist ein Konstrukt, während "while(){}" eine andere.

Es gibt nicht so etwas wie „do while“; Sie nisten sie versehentlich und Vorteil der Tatsache, dass {} für einzelne Anweisungen optional.

Mit anderen Worten, dies ist legal Syntax:

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

Und wie in if-Anweisungen, ein Block als eine einzige Anweisung behandelt wird.

Was zu sagen ist, Ihre erste mögliche Antwort ist die richtige, wobei „while(){}“ ist das einzige nicht-eingeklammert, was im Innern des äußeren „do {} while();

Ich glaube nicht, dieser Code legal ist.

do while(testA) {

        // do stuff

    } while(testB);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top