Java tun, während, während

8

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.

    
Pindatjuh 12.03.2010, 17:25
quelle

6 Antworten

6

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.

    
John Kugelman 12.03.2010, 17:37
quelle
3

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;)

    
Felix Kling 12.03.2010 17:41
quelle
1

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:)

    
Andrea Zilio 12.03.2010 17:36
quelle
1

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.

    
quelle
1

" 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(); "

ist     
Sparr 12.03.2010 17:30
quelle
0

Ich glaube nicht, dass dieser Code legal ist.

%Vor%     
giri 12.03.2010 17:36
quelle

Tags und Links