Welches Verhalten kann ich erwarten, wenn ich diesen Code ausführe:
%Vor%Wird es sich wie folgt verhalten:
%Vor%Oder:
%Vor%Oder etwas völlig unerwartetes?
Ich stelle diese Frage, weil ich denke, dass das ziemlich zweideutig ist, und für andere Leute, die zu diesem Thema suchen, nicht , weil ich faul bin, es zu testen.
Es entspricht Ihrem ersten Block:
%Vor%Die relevanten Teile der Java-Grammatik beim Parsen Das sind:
%Vor% Sie können sehen, dass der Java-Compiler dies als do <WhileStatement> while ( Expression ) ;
analysiert. Das ist der einzig gültige Weg, den von Ihnen geschriebenen Code zu analysieren.
Beachten Sie, dass es keine spezielle Regel zum Parsen dieses Konstrukts gibt. Es ist einfach verwirrend für einen Menschen zu lesen aufgrund der ungewöhnlichen Art, wie die do-while-Schleife geschrieben wird. In der normalen Verwendung wird do-while immer als do { ... } while
mit expliziten geschweiften Klammern geschrieben.
Es funktioniert zwar, aber das Verhalten hängt davon ab, welche Bedingungen Sie testen. Z.B. dieser Code:
%Vor%Ausgänge:
%Vor%So funktioniert es wie:
%Vor%Durch Austausch der Variablennamen:
%Vor%Die Ausgabe ist:
%Vor%Es sieht so aus, als ob es sich genauso verhält wie im ersten Fall (d. h. die erste while wird berücksichtigt), aber hier endet die Anwendung nicht!
Zusammenfassung:
Zu der Zeit, wenn testA
nicht mehr nicht mehr zufriedenstellend ist und testB
auch nicht erfüllt ist, funktioniert der Code wie eine normale while(testA){}
-Schleife.
Aber: Wenn testA
nicht mehr erfüllt ist, testB
immer noch erfüllt ist , ist die Schleife nicht mehr ausgeführt und das Skript beendet nicht . Dies gilt nur, wenn die Bedingung der "äußeren" Schleife innerhalb der Schleife geändert werden muss.
Aktualisierung:
Und nachdem ich eine andere Antwort gelesen habe, merke ich, dass dies genau das Verhalten der verschachtelten do-while
- while
-Schleife ist.
Wie auch immer, Lektion gelernt: Verwenden Sie nicht diese Art von Syntax, weil es Sie verwirren kann;)
Es verhält sich wie
%Vor%Dieser Code-Block wird also folgendermaßen geparst:
mache {einen Block von Code}, während testB wahr ist. Wo {ein Block von Code} ist die innere Weile.
Es ist sicherlich etwas ungewöhnlich, einen solchen Code zu schreiben:)
Die Antwort lautet # 1. Solange testB
erfüllt ist, wird die Schleife fortgesetzt, aber der Code wird nicht ausgeführt, wenn testA
nicht erfüllt ist.
" do {} while();
" ist ein Konstrukt, während " while(){}
" ein anderes ist.
Es gibt keine " do while
"; Sie verschachteln sie versehentlich und nutzen die Tatsache, dass {} für einzelne Anweisungen optional ist.
Mit anderen Worten, das ist die legale Syntax:
%Vor% Und wie in if
-Anweisungen wird ein Block als einzelne Anweisung behandelt.
Das heißt, Ihre erste mögliche Antwort ist die richtige, wobei " while(){}
" das einzige nicht geklammerte Ding innerhalb der äußeren " do {} while();
"