2017-01-15 2 views
-3

Dies ist eine überarbeitete Version meiner previous Frage.Inkonsistenz mit anderen Aussagen?

Wenn ich else-if als Abkürzung benutze, bin ich mir nicht ganz sicher, warum, Syntax weise, es führt die gleiche Funktionalität wie verschachteln if-else-Anweisungen. Angenommen, Sie haben die folgende:

int score = 80; 
if(score < 80) { 
    System.out.println("C Grade"); 
} else if(score < 90) { 
    System.out.println("B Grade"); 
} else if(score < 100) { 
    System.out.println("A Grade"); 
} 

Wenn ich eine Vertiefung hinzufügen, bekomme ich etwas ähnliches wie:

if(score < 80) { 
    System.out.println("C Grade"); 
} else 
    if(score < 90) { 
    System.out.println("B Grade"); 
    } else 
    if(score < 100) { 
     System.out.println("A Grade"); 
    } 

Dies wertet die gleiche wie if-else-Anweisungen als solche verschachtelt Schreiben:

if(score < 80) { 
    System.out.println("C Grade"); 
} else { 
    if(score < 90) { 
     System.out.println("B Grade"); 
    } else { 
     if(score < 100) { 
     System.out.println("A Grade"); 
     } 
    } 
} 

Ich sehe jedoch einen großen Unterschied. Im dritten Code-Snippet hat die "else" -Anweisung Klammern, und die verbleibenden if-else-Anweisungen sind innerhalb dieser Klammern verschachtelt. Im ersten Szenario gibt es keine einkapselnden Klammern. Also warum funktioniert die erste Idee von else-if-work, wenn ich scheinbar Klammern bei der Verschachtelung von if-else-Anweisungen brauche? Ich dachte, dass ein Mangel an Konsolen mit Steuerflussanweisungen wie if, else, während usw. bewirken, dass die Compiler nur die folgende Zeile zu bewerten, wie zum Beispiel:

if(condition) 
    System.out.println("A"); 
    System.out.println("B"); 
//only prints "A" 
+0

else-if in Java verhält sich wie sonst gefolgt von if - intensionally. Das Fehlen von Klammern bewertet NICHT die folgende Zeile, sondern die folgende Aussage. Da if (oder if else) eine Aussage ist, ist es ziemlich konsistent. – CoronA

+1

Ein Tipp, wenn Sie Fragen stellen - Behauptungen in Ihrem Titel zu machen (wie das Setzen, dass "else" Aussagen inkonsistent sind) wird zu downvotes führen, da Leute eher Ihrer Behauptung widersprechen als versuchen, Ihnen zu helfen. Konzentriere dich stattdessen darauf, was du wirklich fragst, z. "Können Sie mir helfen, die Syntax von' else if'-Anweisungen zu verstehen? " Das wird eher zu Hilfe als zu Downvotes führen. – dimo414

Antwort

1

Als Erstes beachten Sie, dass if und else immer auf die einzelne nachfolgende Anweisung zutreffen. Sie können { } verwenden, um mehrere Anweisungen in einer einzigen zusammengesetzten Anweisung zu gruppieren, die Bedingung gilt dann jedoch für die einzelne { ... }-Anweisung.

Betrachten Sie diese zwei gleichwertige Anweisungen:

if (foo) { 
    bar(); 
} 

if (foo) 
    bar(); 

Im ersten der if zum { } Block gilt, während in der zweiten (die bar(); enthält) direkt auf die Erklärung bar(); gilt. Was nicht sofort offensichtlich ist, ist, dass { } nicht die einzige Möglichkeit ist, eine zusammengesetzte Anweisung zu erstellen. In der Tat ist if eine andere Verbindung Ausdruck, daher kann es das direkte Kind einer anderen if oder else Aussage sein. Zum Beispiel:

if (foo) 
    if (bar) { 
    baz(); 
    } 

ist vollkommen gültig (wenn schwer zu lesen) und ist äquivalent zu:

if (foo) { 
    if (bar) { 
    baz(); 
    } 
} 

Das gleiche Konzept gilt für else - was auch immer Anweisung folgt, wird sie angewendet werden, wenn die bedingte vorhergehenden ist falsch, auch wenn diese Aussage selbst eine zusammengesetzte Aussage ist!

if (foo) { 
    bar(); 
} 
else 
    if (baz) { 
    biff(); 
    } 

Die else gilt für den gesamten if (baz) Block, und da es nur eine einzige (Verbindung) Aussage ist gibt es keine Notwendigkeit für einen zusätzlichen { } Block.

Die genaue Grammatik wird in JLS §19 angegeben, und die Grammatik der verschiedenen Formen der if Anweisung in JLS §14.9 beschrieben. Beachten Sie, dass else if nicht erwähnt wird, da es sich nicht um einen formalen Teil der Sprache handelt, einfach eine (beabsichtigte) Konsequenz der Grammatik.


von All das sagte, der Grund echte wir formatiert den Code nicht so, wie Sie einfach beschreiben sind, weil es schwieriger ist, zu lesen. Es ist viel einfacher, an else if als ein einzelnes Schlüsselwort zu denken und den Code entsprechend einzurücken. Einige andere Sprachen (z. B. Python) verwenden ein einzelnes Schlüsselwort wie elif, um die Grammatik zu vereinfachen, aber es ist nicht wirklich notwendig.

+0

Danke !! Das ist sehr hilfreich. Ich versuche es komplett zu verstehen - mit meiner zweiten Aussage, die ich in meiner Frage geschrieben habe, sind Zeilen 4 bis zum Ende alle eine Aussage dann? Von 'if (score <90)' bis zum Ende – rb612

+0

Nun, ja und nein :) Die 'if'- und' else'-Körper einer 'if-else'-Anweisung sind selbst Statements und können daher auch' if-else sein 'Aussagen. Mit anderen Worten, jedes Ihrer Beispiele * ist * eine einzelne Anweisung - aber diese Anweisungen bestehen dann aus Unterausdrücken, die auch gültige Anweisungen sind. – dimo414

+0

Ich habe in meiner Antwort einige Links zum JLS hinzugefügt, falls das hilfreich ist. – dimo414

2

Wenn es keine Klammern, die folgenden Anweisung wird verwendet, nicht nur die folgenden Zeile.

Eine if-Anweisung besteht aus

if (<condition>) <statement> else <statement> 

Es spielt keine Rolle, wenn es auf mehrere Zeilen geschrieben. Im Allgemeinen können Zeilenumbrüche in Java überall dort auftreten, wo Leerraum zulässig ist, ohne die Bedeutung zu ändern (die einzigen Ausnahmen sind in String-Literalen und Ein-Zeilen-Kommentaren).

+0

Ah! Also sind das Wenn und das Andere eine Aussage? Wenn also ein "else" keine Klammern hat, wird es sich das erste "Paar" eines if und else ansehen und das auswerten? – rb612

+0

Ja. Das 'else' wird immer dem nächsten 'if' zugeordnet. – Henry

+0

nur um zu klären, eine if-else-Gruppierung ist eine Aussage? Aber darin gibt es Aussagen, die "wenn" und "sonst" entsprechen? – rb612

1

Halterungen sind kein Durchflusskontrollmechanismus. Sie sind in erster Linie eine Aussage Gruppierung Mechanismus.

Die Syntax für eine einfache ifelse Anweisung lautet:

'if' '(' expression ')' statement 'else' statement 

A 'Anweisung' kann eine Zuweisungsanweisung, ein Methodenaufruf, ein verschachteltes if und so weiter. Aber eine ‚Aussage‘ nicht zwei Aussagen, oder drei, oder ...

Hier {} hinein kommt, weil

'{' statement-list '}' 

tatsächlich statement nach den Java-Syntaxregeln. Wenn Sie die geschweiften Klammern verwenden, gruppieren Sie (möglicherweise) viele Anweisungen in einer einzigen Anweisung.

Wenn Sie dieses Wissen auf Ihre Beispiele anwenden, wird das "mysteriöse" Verhalten, das Sie zu sehen glauben, einfach und unkompliziert sein.

Für das Protokoll, es ist empfohlen, dass Sie immer {} Blöcke mit if Anweisungen und Schleifen verwenden, weil es Ihren Code leichter zu lesen macht.


Ich dachte, dass ein Mangel an Konsolen mit Steuerflussanweisungen wie if, else, während usw. bewirken, dass die Compiler nur die folgende Zeile bewerten.

Sie haben eine falsche Schlussfolgerung gezogen. In der Sprache Java ist es für die Bedeutung Ihres Codes, wo Sie die Zeilenumbrüche setzen, (ziemlich) irrelevant. Die einzige Einschränkung ist, dass Sie keine Zeilenumbrüche in der Mitte von Tokens wie Keywords, Operatoren, Bezeichnern und Literalen einfügen können. (Und ein Zeilenumbruch beendet einen // Kommentar.

)

By the way, versucht, eine Programmiersprache zu lernen, indem es wie Text und erraten die Syntax zu lesen ist ein schlechter Ansatz. Du wirst alle möglichen falschen Ideen haben. Ein besserer Ansatz ist es, ein gutes Lehrbuch zu lesen oder das offizielle Tutorial-Material der Sprache.

+0

Danke Stephen, ich stimme zu. Ich habe Java schon seit Jahren gelernt und diese Idee ist einfach aufgetaucht, da ich es gewohnt bin, andere zu benutzen, wenn ich nur angefangen habe zu fragen, warum es funktioniert. Also ist also alles in meinem zweiten Code-Schnipsel, von 'if (score <90)' bis zum Ende alle eine Aussage? – rb612

+0

Also um sicherzustellen, dass ich vollständig verstehe, wenn Java "else" -Block ohne geschweifte Klammern nur die nächste Anweisung, wenn es von einem if-else gefolgt wird, das "if" und das "else" als eine Aussage betrachtet werden? Sonst würde Java das "else" nicht als Teil der Verschachtelung bewerten, richtig? – rb612

+0

Es ist einfacher als das. Nach dem "sonst" sollte es eine Aussage geben. Es könnte ein einfacher Methodenaufruf oder eine Zuweisungsanweisung sein. Es könnte eine andere 'if' Aussage sein. Es könnte eine Blockaussage sein. Es muss nur eine Aussage sein. –