Ist "else if" ein einzelnes Schlüsselwort?


100

Ich bin neu in C ++. Ich sehe oft bedingte Aussagen wie folgt:

if 
  statement_0;
else if
  statement_1;

Frage:

Soll ich syntaktischelse if als ein einzelnes Schlüsselwort behandeln? Oder ist es tatsächlich eine verschachtelte ifAnweisung innerhalb des Äußeren elsewie unten?

if 
  statement_0;
else 
  if
    statement_1;

5
Zu deinem zweiten Punkt. Syntaktisch ist es fast immer geschriebenelse if
TheNorthWes

8
Nein, da dies die Grammatik noch komplexer machen würde: Ein Wort ist ein Wort ohne Leerzeichen. Andere Sprachen haben jedoch Schlüsselwörter wie elseifund ELIF. Tatsächlich erlaubt nur (?) Die Programmiersprache Algol68 ein Leerzeichen in einem Bezeichner; schön auch:PROC walk through tree ()
Joop Eggen

3
Fortran (zumindest die Versionen mit fester Form) und alle standardisierten Versionen von Algol lassen überall Platz. Eine Geschichte besagt, dass Lochkarten-Locher anscheinend dazu neigten, beim Eingeben von Code Leerzeichen hinzuzufügen. Zum anderen könnten Programmierer durch das Zulassen von Leerzeichen in Variablennamen bessere Namen verwenden, und die Probleme waren nicht vorgesehen.
Prosfilaes

1
Das elseifSchlüsselwort existiert in VB und PHP.
Salman A

3
Nitpick: Obwohl C ++ offiziell keine Schlüsselwörter mit Leerzeichen enthält, funktionieren Konstrukte wie in jeder Hinsicht so. Zum Beispiel müssen long doubleSie das so schreiben. longdoubleist falsch.
Herr Lister

Antworten:


133

Sie sind nicht ein einziges Schlüsselwort ein, wenn wir zu der gehen Entwurf C ++ Standard Abschnitt 2.12 Keywords Tabelle 4listet sowohl ifund elsegetrennt und es gibt kein else ifSchlüsselwort. Wir können eine zugängliche Liste von C ++ finden Keywords , indem Sie auf cppreferences Abschnitt auf Schlüsselwörter .

Die Grammatik im Abschnitt 6.4macht dies auch deutlich:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

Das ifin else ifist eine Aussage nach dem elseBegriff. Der Abschnitt sagt auch:

[...] Die Unteranweisung in einer Auswahlanweisung (jede Unteranweisung in der else- Form des if Anweisung) definiert implizit einen Blockbereich (3.3). Wenn die Unteranweisung in einer Auswahlanweisung eine einzelne Anweisung und keine zusammengesetzte Anweisung ist , ist es so, als ob sie als zusammengesetzte Anweisung umgeschrieben wurde, die die ursprüngliche Unteranweisung enthält.

und bietet das folgende Beispiel:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Wie wird Ihr leicht erweitertes Beispiel analysiert?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

wird wie folgt analysiert:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

Hinweis

Wir können auch feststellen, dass es else ifsich nicht um ein Schlüsselwort handeln kann, indem wir erkennen, dass Schlüsselwörter Bezeichner sind , und wir können anhand der Grammatik nach einem Bezeichner in meiner Antwort auf Können Sie einen Klassennamen mit einer numerischen Ziffer beginnen beginnen? Diese Leerzeichen sind in Bezeichnern nicht zulässig und können daher else ifkein einzelnes Schlüsselwort sein, sondern müssen zwei separate Schlüsselwörter sein .


1
Sie könnten dies ohne den Standard ableiten? In ASM ist es: jeq( if| else if), jne( if| else if), jmp( else). Auf dieser Grundlage hätte ich gesagt, dass es sich um ein einzelnes Schlüsselwort handelt. Wahrscheinlich nicht syntaktisch, sondern in Bezug auf Anweisungen.
Brandon

18
@Brandon Ich bezweifle sehr, dass Sie zuverlässig von der Assemblersprache zu Konstrukten auf hoher Ebene wechseln können, ohne die verwendete Grammatik und den Compiler selbst genau zu kennen.
Shafik Yaghmour

Beachten Sie jedoch, dass diese Definition möglicherweise zu dem wunderbaren Problem des mehrdeutigen Syntaxbaums "Dangling else" führt, wenn Sie die Grammatik im Parser definieren ...
LinearZoetrope

2
Einige Sprachen unterstützen nicht else if, sondern elsif. In diesen Sprachen else ifist wirklich ein Schlüsselwort. C-basierte Sprachen tun dies jedoch im Allgemeinen nicht, wie in dieser Antwort angegeben.
sfdcfox

1
Ich denke, @Krumia wollte eine endgültige elseErklärung sehen. Das würde ich auch schätzen.
Matthias

78

Syntaktisch ist es kein einzelnes Schlüsselwort. Schlüsselwörter dürfen keine Leerzeichen enthalten. Logischerweise ist es beim Schreiben von Listen von else ifwahrscheinlich besser, wenn Sie es als ein einzelnes Schlüsselwort sehen und schreiben:

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

Der Compiler sieht dies buchstäblich als:

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

aber beide Formen kommen zur gleichen Sache heraus, und die erste ist viel besser lesbar.


1
Eigentlich sah der Compiler nicht wörtlich elsegefolgt von a compound-statement. Nach einem else, Es sucht nach statement(was wie return;oder sein könnte f()) oder einem compound-statement...
Die Maske

@TheMask: Gemäß der obigen Antwort von Shafik Yaghmour sieht der Compiler buchstäblich eine einzelne Anweisung, gibt jedoch vor , eine zusammengesetzte Anweisung gesehen zu haben.
Ilmari Karonen

Diese Antwort bestimmt, wie Parser Token extrahieren. Gut.
Haccks

24

Nein ist es nicht.
Es handelt sich um zwei Schlüsselwörter, und außerdem ist das zweite "if" eine Unteraussage "innerhalb" des Bereichs, der durch die erste "else" -Anweisung bestimmt wird.


2
Obwohl dies gut beschreibt, was los ist, möchten Sie möglicherweise einige Referenzen für die tatsächlichen Sprachdefinitionen hinzufügen, um besser zu beweisen, was Sie sagen.
πάντα ῥεῖ

2
@ πάνταῥεῖ: Sie haben Recht mit den Referenzen, aber diese Arbeit wurde von Shafik Yaghmour noch gut gemacht. Seine Antwort war die akzeptierte und ich habe auch abgestimmt. Mein Job ist hier beendet.
Pablo1977

16

Sie können den Bereich mit geschweiften Klammern anzeigen:

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

Und normalerweise mit zwei unterschiedlichen Schlüsselwörtern implementiert, eines ist if und eines ist else .


Ich nehme also an, dass diejenigen, die darauf bestehen, dass geschweifte Klammern überall dort verwendet werden sollten, wo eine zusammengesetzte Aussage akzeptiert wird, alle ihre nicht trivialen Bedingungen so schreiben sollten, oder? :)
dlf

5
Ich denke, man kann alles übertreiben, sogar unsere allgeliebten geschweiften Klammern. Mach das nicht zu Hause.
Rentier

1
Alle in Klammern strukturierten Sprachen (die ich kenne), die geschweifte Klammern um alle Unteraussagen erfordern, auch wenn sie aus einer einzelnen Anweisung bestehen, haben ein einzelnes Token-Schlüsselwort mit der Bedeutung "else if". Ich denke, das ist bezeichnend.
zwol

@Zack: Swift ist eine Sprache, die gegen deine Regel verstößt. Es erfordert geschweifte Klammern, auch für Codeblöcke mit einer Anweisung, hat jedoch kein "else if" -Schlüsselwort. Andererseits unterscheidet sich die Grammatik stark von C. An if-statementendet mit einem optionalen else-clause. Ein else-clauseist entweder else code-block oder else if-statement. code-blockenthält obligatorische Zahnspangen. Also das elseSchlüsselwort kann nur gefolgt werden , {oder if.
GraniteRobert

@GraniteRobert Ich hatte selbst keine Zeit, Swift anzuschauen, aber das ist ein interessanter Datenpunkt. Ich dachte, dass eine solche Grammatik eine Möglichkeit wäre , hatte sie aber noch nie gesehen. Und Sie werden feststellen, dass auch dadurch vermieden wird, dass Leute " else { if ... }" schreiben .
zwol

10

Wie bereits beantwortet, ist es nicht. Sie sind zwei Schlüsselwörter. Es ist der Beginn von zwei Aussagen, die aufeinander folgen. Um es etwas klarer zu machen, hier ist das BNF-Grammar, das sich mit ifund elseAnweisungen in C ++ - Sprache befasst.

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

Beachten Sie, dass statementselbst enthalten selection-statement. Also, Kombinationen wie:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

sind gemäß C ++ Standard / Semantik möglich und gültig.

Hinweis: Die C ++ - Grammatik stammt von dieser Seite.



-1

Ich möchte nur all diesen Erklärungen meinen Standpunkt hinzufügen. Wenn Sie diese Schlüsselwörter separat verwenden können, müssen sie meines Erachtens ZWEI Schlüsselwörter sein. Vielleicht können Sie sich die C ++ - Grammatik über diesen Link im Stackoverflow ansehen: Gibt es eine Standard-C ++ - Grammatik?

Grüße


-1

Auf eine if-Anweisung kann eine optionale else if ... else-Anweisung folgen, die sehr nützlich ist, um verschiedene Bedingungen mit einer einzelnen if ... else if-Anweisung zu testen.

Bei der Verwendung von if-, else if, else-Anweisungen sind nur wenige Punkte zu beachten.

Ein if kann null oder eins haben und es muss nach jedem anderen if kommen.

Ein Wenn kann null bis viele andere Wenn haben und sie müssen vor dem Anderen kommen.

Sobald ein anderer erfolgreich ist, wird keiner der verbleibenden anderen getestet, wenn oder sonst.

schau mal wenn ... sonst Anweisung Tutorial .


2
Dies entspricht einfach nicht dem Standard und ist darüber hinaus redundant. Die Sprache verfügt über die gesamte Ausdruckskraft, um zu simulieren, else ifals wäre sie ein Schlüsselwort. Es macht also keinen Sinn, sie explizit zu definieren.
Ruslan

1
Dies ist eine nützliche Vereinfachung für Programmierer. Die Frage ist jedoch nicht, wie if-Anweisungen verwendet werden sollen.
Cruncher
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.