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
Ich verstehe, dass ForInit
und ForUpdate
weggelassen werden können. Aber zumindest würde ich erwarten, dass Expression
obligatorisch ist, wie in while-loop:
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
?
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 enthalteneStatement
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 Typboolean
oderBoolean
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.