Syntax mit fehlgeschlagenem Ausdruck für grundlegende for-Schleife

8

Vor einigen Tagen habe ich mit meinen Kollegen über diesen Code in Java gesprochen:

%Vor%

Nichts Besonderes hier, nur eine Endlosschleife.

Aber wir fragen uns, warum das syntaktisch korrekt ist. Wenn Sie einen Blick auf JLS §14.14.1 Sie werden das sehen:

%Vor%

Ich verstehe, dass ForInit und ForUpdate weggelassen werden können. Aber zumindest würde ich erwarten, dass Expression obligatorisch ist, wie in while-loop:

%Vor%

Warum kann Expression in einer For-Schleife weggelassen werden? Und selbst wenn man mehr darüber nachdenkt - warum wird der verpasste Ausdruck in true aufgelöst? Meine Erwartung wäre, dass der leere Ausdruck in false aufgelöst wird.

Dasselbe gilt für andere Sprachen (Ich habe es mit C und JavaScript versucht, aber ich glaube, dass jede Sprache mit for-Schleifen sich so verhält).

Warum ist eine Ausdrucksklausel in for-Schleife nicht zwingend (aber in while-Schleife)? Warum wird der leere Ausdruck in true aufgelöst und nicht in false ?

    
Walery Strauch 10.02.2016, 17:35
quelle

1 Antwort

3

Die Begründung beginnt in JLS 14.14.1.1 und geht weiter in 14.14.1.2, Betonung meins.

  

Wenn der ForInit part nicht vorhanden ist , wird keine Aktion ausgeführt.

     

Wenn das Expression nicht vorhanden ist oder es vorhanden ist und der Wert, der sich aus seiner Auswertung ergibt (einschließlich eines möglichen Unboxing), wahr ist, wird das enthaltene Statement ausgeführt ...

Die JLS erlaubt die leeren ForInit , Expression und ForUpdate Anweisungen und hat Bedingungen, um mit ihrer Abwesenheit fertig zu werden, daher ist es akzeptabel sie zu ignorieren.

Es ist nicht zulässig, dies mit while loops zu tun, per JLS 14.12 .

  

Der Expression muss den Typ boolean oder Boolean haben oder es tritt ein Fehler bei der Kompilierung auf.

Daraus ergibt sich, dass die Spezifikation nicht erlaubt, dass ein leerer Ausdruck übergeben wird, da dies zu einem Fehler bei der Kompilierungszeit führen würde.

Wenn Sie nach einem etwas historischeren Grund suchen, finden Sie die C-Spezifikation mandatiert das auch .

Da Java stark von C inspiriert wurde (und größtenteils darin implementiert ist), macht es durchaus Sinn, dass sich Java-Schleifen ähnlich wie C-Schleifen verhalten, und so verhalten sie sich: Ausdrücke sind in Cs for -Anweisung optional. und obligatorisch in seiner while -Anweisung.

    
Makoto 10.02.2016 17:40
quelle

Tags und Links