2016-05-22 8 views
3

Ich studiere für eine Java-Zertifizierung und auf einer der Scheinprüfungen sah ich eine sehr seltsame Implementierung der For-Schleife. Die Übung zeigte die folgende Syntax:Warum erweiterte for-Schleife nicht fehlschlägt, wenn mit Semikolon endet?

for (Days d: Days.values()); 

Am Anfang dachte ich, dass es ein Syntaxfehler war, da ich, dass die Syntax wusste immer, für die „For-Schleife“ erfordert geschweiften Klammern oder, wenn es nur eine Instruktion zur Iteration können wir die geschweiften Klammern überspringen und unsere Anweisung direkt nach der Schleife ausrichten. - Da ich nicht vor einem For-Schleife mit Semikolon endet gesehen haben „;“ .--

Dann habe ich versucht, eine Dokumentation über sie zu finden, aber leider konnte ich keine Erklärung finden, warum ist eine rechtliche Code Erklärung . Nur Verweise auf die folgende Syntax:

The syntax of enhanced for loop is: 

for(declaration : expression) 
{ 
    //Statements 
} 

Das Seltsame ist, nach all dies, dass ich meinen Code getestet und überraschend es kompiliert und lief richtig. Dann, basierend auf einigen Tests, die ich gemacht habe (mit dem Code), entdeckte ich, dass es scheint, dass das ";" funktioniert wie eine For-Schleife leer, aber mit geschweiften Klammern, so dass jede Anweisung danach nur einmal ausgeführt wird. (Als ob der Code außerhalb der Schleife wäre). Aber ich bin nicht sicher, ob dies die richtige Interpretation des Semikolons auf den erweiterten for-Schleifen ist.

Bitte beachten Sie die komplette Beispiel:

package com.TestDays; 
public class TestDays { 
    public enum Days { MON, TUE, WED}; 
    public static void main(String[] args) { 
    int x = 0; 
    *for (Days d: Days.values());* 
    Days[] d2 = Days.values(); 
    System.out.println(d2[2]); 
    } 

} 
  • Hat jemand weiß, warum diese Syntax erlaubt? Danke.
+2

A 'for (Tage d: Days.values ​​());' ist das selbe wie 'for (Tage d: Days.values ​​()) {// nichts in den curlies}', leer für die Anweisung. –

Antwort

0

Es gibt 3 verschiedene Möglichkeiten, eine for-loop oder enhanced for-loop können in Java erstellt werden:

for (int i = 0; i < 5; i++) { 
    System.out.println(i); 
} 

for (int i = 0; i < 5; i++) System.out.println(i); 

for (int i = 0; i < 5; i++); 

Diese drei Schleifen sind äquivalent zu:

  1. Für jedes Mal, i ist weniger als 5 tue, was auch immer zwischen {} ist und erhöhe den Wert um eins.
  2. Für jedes Mal, wenn i kleiner als 5 ist, i drucken und den Wert um eins erhöhen.
  3. Für jedes Mal, wenn i kleiner als 5 ist, erhöhen Sie den Wert um eins.

Es ist nicht eine Frage von, "warum es nicht versagt", es ist mehr, "was die for-Schleife gesagt wird zu tun".

Speziell, WARUM es nicht fehlschlägt, ist die Art, wie die For-Schleife-Syntax ausgelegt ist. Dies wurde sehr gut in Stephen C Antwort erklärt:

Nach dem Java 8 JLS, die echte Java-Syntax für die verbesserte for Schleife ist

EnhancedForStatement: 
    for ({VariableModifier} UnannType VariableDeclaratorId : Expression) 
     Statement 

EnhancedForStatementNoShortIf: 
    for ({VariableModifier} UnannType VariableDeclaratorId : Expression) 
     StatementNoShortIf 

Wie Sie sehen können, Statement bezieht sich auf Jede gültige Aussage, die die Verwendung von ;, wie ; enthält, ist eine gültige "Statement".Da dies erlaubt ist, gibt es keinen Grund, warum es in jedem Fall scheitern sollte.

Infact, eine andere Art und Weise for (int i = 0; i < 5; i++); zu interpretieren wäre:

„Für jedes Mal i weniger als 5, laufen Aussagen und seinen Wert um eins erhöht.“

Gleiche Regeln können angewendet werden:

for (Integer i : ints) { 
    System.out.println(i); 
} 

for (Integer i : ints) System.out.println(i); 

for (Integer i : ints); 
+1

Eigentlich macht es Sinn, vielen Dank für Ihre Erklärung. –

+0

@ B.Demille Danke. Wenn diese Antwort Ihre Frage gelöst hat, können Sie sie als akzeptiert markieren. – finnrayment

+0

Bitte erläutern Sie den Downvote? – finnrayment

3

https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

Eine for-Schleife ist wie folgt definiert:

for (ForControl) Statement 

; eine gültige Anweisung in Java ist, wie ein Block aus Aussagen. Nicht etwas, das Sie sehen oft mit dieser Form der Schleife, aber man kann Dinge tun:

int i = 2; 
for(; i < 100; i*=2); 
// i is now the smallest power of two greater than 100 
1

Die Dokumentation, die Sie lesen, ist nicht die offizielle Dokumentation, da die Autoren geschrieben hätte:

Die verbesserte for Anweisung hat die Form for (declaration : expression) statement

Dies liegt daran, die geschweiften Klammern nicht benötigt werden.

Ein einzelnes Semikolon bildet eine sogenannte _ empty-Anweisung_, wodurch Ihr Code-Snippet syntaktisch gültig wird.

2

Bitte beachten Sie, dass nur in der Dokumentation erwähnt die folgende Syntax:

The syntax of enhanced for loop is: 

for(declaration : expression) 
{ 
    //Statements 
} 

Die „Dokumentation“, zitierte Frage kommt von einer Seite auf TutorialsPoint (wie auf 2016-05- von mir gesehen 22). Ich werde nicht darauf verlinken, aber vorausgesetzt, sie haben es (noch) nicht korrigiert, sollten Sie es mit einer Google-Phrasensuche finden können.

Dies ist NICHT die offizielle Dokumentation. Die einzige offizielle Dokumentation für Java ist die Dokumentation, die von Mitarbeitern von Oracle (und früher von Sun Microsystems) geschrieben und von diesen Organisationen veröffentlicht wurde.

TutorialsPoint hat keine Berechtigung. In diesem Fall haben sie einfach die Java-Syntax falsch verstanden.

Gemäß der Java 8 JLS, die reale Java-Syntax für die verbesserte for Schleife

EnhancedForStatement: 
    for ({VariableModifier} UnannType VariableDeclaratorId : Expression) 
     Statement 

EnhancedForStatementNoShortIf: 
    for ({VariableModifier} UnannType VariableDeclaratorId : Expression) 
     StatementNoShortIf 

wo StatementStatementNoShortIf und die leere Erklärung enthalten; ein leeres Semikolon.


1 - Die Grammatikregeln werden von der Java 8 Grammatik zitiert. Die Variante "no short ifs" handelt von verschachtelten if Aussagen und ist hier nicht relevant. In der Java 7 JLS gibt es zwei Versionen der Grammatik in der Spezifikation, eine mit den Varianten und eine ohne diese.

Verwandte Themen