«Else if» est-il un seul mot-clé?


100

Je suis nouveau en C ++. Je vois souvent une déclaration conditionnelle comme ci-dessous:

if 
  statement_0;
else if
  statement_1;

Question:

Syntaxiquement , dois-je traiter else ifcomme un mot clé unique? Ou est-ce en fait une ifinstruction imbriquée dans l'extérieur elsecomme ci-dessous?

if 
  statement_0;
else 
  if
    statement_1;

5
À votre deuxième point. Syntaxiquement, il est presque toujours écritelse if
TheNorthWes

8
Non, car cela rendrait la grammaire encore plus complexe: un mot est un mot sans espace. D'autres langues ont cependant des mots-clés comme elseifet ELIF. En fait seul (?) Le langage de programmation Algol68 permet un espace dans un identifiant; bien trop:PROC walk through tree ()
Joop Eggen

3
Fortran (au moins les versions à forme fixe), et toutes les versions standardisées d'Algol permettent des espaces n'importe où. Une histoire raconte que les perforateurs de cartes perforées étaient apparemment enclins à ajouter des espaces lors de la saisie de code; un autre simplement que permettre des espaces dans les noms de variables permettrait aux programmeurs d'utiliser de meilleurs noms et les problèmes n'étaient pas prévus.
prosfilaes

1
Le elseifmot clé existe en VB et PHP.
Salman A

3
Nitpick: bien que C ++ n'ait officiellement pas de mots-clés avec des espaces, il a des constructions comme à toutes fins utiles et fonctionnent de cette façon. Par exemple, long doublevous devez écrire cela de cette façon. longdoubleest incorrect.
Mr Lister

Réponses:


133

Ils ne sont pas un mot-clé unique si nous allons à la section standard du projet de norme C ++ . Le tableau des 2.12 mots - clés4 répertorie les deux ifet elseséparément et il n'y a pas de else ifmot-clé. Nous pouvons trouver une liste plus accessible de mots-clés C ++ en allant dans la section cppreferences sur les mots-clés .

La grammaire de la section le 6.4précise également:

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

Le ifin else ifest une déclaration qui suit le elseterme. La section dit également:

[...] La sous -déclaration dans une instruction de sélection (chaque sous -instruction , sous la forme else de l' instruction if ) définit implicitement une portée de bloc (3.3). Si la sous-déclaration dans une instruction de sélection est une instruction unique et non une instruction composée , c'est comme si elle avait été réécrite pour être une instruction composée contenant la sous-déclaration d'origine.

et donne l'exemple suivant:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Alors, comment votre exemple légèrement étendu est-il analysé?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

sera analysé comme ceci:

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

Remarque

Nous pouvons également déterminer qu'il else ifne peut pas s'agir d'un mot-clé en réalisant que les mots - clés sont des identifiants et nous pouvons voir dans la grammaire un identifiant dans ma réponse à Pouvez-vous commencer un nom de classe avec un chiffre numérique? que les espaces ne sont pas autorisés dans les identifiants et ne else ifpeuvent donc pas être un seul mot-clé mais doivent être deux mots-clés séparés .


1
Vous pourriez déduire cela sans la norme? Dans l'ASM, c'est: jeq( if| else if), jne( if| else if), jmp( else). Sur cette base, j'aurais dit que c'était un mot-clé unique ... probablement pas syntaxiquement mais en termes d'instructions.
Brandon

18
@Brandon Je doute fort que vous puissiez passer de manière fiable du langage d'assemblage à des constructions de haut niveau sans une connaissance approfondie de la grammaire utilisée et du compilateur lui-même.
Shafik Yaghmour

Cependant, notez que cette définition conduit potentiellement au merveilleux problème d'arbre de syntaxe ambigu de "balançant autrement" lors de la définition de la grammaire dans l'analyseur ...
LinearZoetrope

2
Certaines langues ne prennent pas en charge else if, mais à la place elsif. Dans ces langues, else ifest vraiment un mot-clé. Cependant, les langages basés sur C ne le font généralement pas, comme l'indique cette réponse.
sfdcfox

1
Je pense que @Krumia voulait voir une elsedéclaration finale . J'apprécierais cela aussi.
Matthias

78

Syntaxiquement, ce n'est pas un mot clé unique; les mots clés ne peuvent pas contenir d'espace blanc. Logiquement, lors de la rédaction des listes de else if, il est probablement mieux si vous le voyez comme un seul mot - clé, et d' écrire:

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

Le compilateur voit littéralement cela comme:

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

mais les deux formes aboutissent à la même chose, et la première est beaucoup plus lisible.


1
En fait, le compilateur n'a pas vu littéralement elsesuivi d'un compound-statement. Après un else, il cherche statement(qui pourrait être comme return;ou f()) ou un compound-statement...
The Mask

@TheMask: Selon la réponse de Shafik Yaghmour ci-dessus, le compilateur voit littéralement une seule instruction, mais prétend avoir vu une instruction composée.
Ilmari Karonen

Cette réponse indique comment l'analyseur extrait les jetons. Bien.
haccks le

24

Non, ça ne l'est pas.
Ce sont deux mots-clés et, de plus, le second «si» est un sous-énoncé «à l'intérieur» de la portée déterminée par la première instruction «else».


2
Bien que cela décrive bien ce qui se passe, vous voudrez peut-être ajouter des références pour les définitions de langue réelles pour mieux prouver ce que vous dites.
πάντα ῥεῖ

2
@ πάνταῥεῖ: Vous avez raison sur les références, mais ce travail a été bien fait par Shafik Yaghmour. Sa réponse a été acceptée et j'ai également voté. Mon travail est terminé ici.
pablo1977

16

Vous pouvez voir la portée en utilisant des accolades:

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

Et normalement implémenté avec deux mots-clés distincts, l'un est si et l' autre est autre .


Donc, je suppose que ceux qui insistent sur le fait que les accolades devraient être utilisées partout où une déclaration composée est acceptée devraient écrire toutes leurs conditions non triviales comme ça, hein? :)
dlf

5
Je pense que l'on peut exagérer n'importe quoi, même nos accolades bien-aimées. Ne faites pas cela à la maison.
renne

1
Tous les langages structurés entre accolades (que je connais) qui nécessitent des accolades autour de tous les sous-énoncés, même s'ils sont composés d'une seule instruction, ont un mot-clé à un seul jeton avec le sens «sinon si». Je pense que c'est révélateur.
zwol

@Zack: Swift est un langage qui enfreint votre règle. Il nécessite des accolades même pour les blocs de code à instruction unique, mais n'a pas de mot clé «else if». En revanche, la grammaire est assez différente de C. An if-statementse termine par une option else-clause. Un else-clauseest soit else code-block ou else if-statement. code-blockcomprend les accolades obligatoires. Le elsemot - clé ne peut donc être suivi que de {ou if.
GraniteRobert

@GraniteRobert Je n'ai pas du tout eu le temps de regarder Swift moi-même, mais c'est un point de données intéressant; Je pensais qu'une telle grammaire était une possibilité mais je ne l'avais jamais vue. Et vous noterez que cela évite aussi de faire écrire " else { if ... }".
zwol

10

Comme déjà répondu, ce n'est pas le cas. Ce sont deux mots clés. C'est le début de deux déclarations qui se succèdent. Pour essayer de le rendre un peu plus clair, voici le gramar BNF qui traite des instructions ifet elseen langage C ++.

 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

Notez que statementlui-même inclut selection-statement. Donc, des combinaisons comme:

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

sont possibles et valides selon la norme / la sémantique C ++.

Remarque: la grammaire C ++ est tirée de cette page.



-1

Je voudrais juste ajouter mon point de vue à toutes ces explications. Selon moi, si vous pouvez utiliser ces mots-clés séparément, ils doivent être DEUX mots-clés. Peut-être que vous pouvez jeter un œil à la grammaire C ++, à partir de ce lien dans stackoverflow: Existe - t-il une grammaire C ++ standard?

Cordialement


-1

Une instruction if peut être suivie d'une instruction else if ... else facultative, ce qui est très utile pour tester diverses conditions en utilisant une instruction if ... else if unique.

Lors de l'utilisation des instructions if, else if, else, il y a peu de points à garder à l'esprit.

Un if peut avoir zéro ou un autre et il doit venir après tout autre if.

Un if peut avoir zéro à beaucoup d'autres if et ils doivent venir avant l'autre.

Une fois qu'un else if réussit, aucun des autres ifs ou else ne sera testé.

jetez un œil au didacticiel sur l'instruction if ... else .


2
Cela ne correspond tout simplement pas à la norme et, de plus, est redondant. Le langage a tout le pouvoir expressif de simuler else ifcomme s'il s'agissait d'un mot-clé, il n'y aurait donc aucun sens à le définir explicitement.
Ruslan

1
C'est une simplification utile pour les programmeurs. Mais la question ne demande pas comment utiliser les déclarations if.
Cruncher
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.