web-dev-qa-db-fra.com

"Else if" est-il un seul mot-clé?

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 if comme mot clé unique? Ou s'agit-il en fait d'une instruction if imbriquée dans le else externe comme ci-dessous?

if 
  statement_0;
else 
  if
    statement_1;
98
modeller

Ils ne sont pas un seul mot-clé si nous allons à la section projet de norme C++2.12 Mots-clés table 4 répertorie à la fois if et else séparément et il n'y a pas de else if mot-clé. Nous pouvons trouver une liste plus accessible de mots-clés C++ en allant à section cppreferences sur les mots-clés .

La grammaire dans la section 6.4 le montre aussi clairement:

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

Le if dans else if est une instruction suivant le terme else. La section dit également:

[...] La sous-déclaration dans une instruction-sélection (chaque sous-déclaration, sous la forme sinon de l'instruction if ) définit implicitement une portée de bloc (3.3). Si la sous-instruction 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-instruction d'origine.

et fournit 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 que else if ne peut pas être 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 to Pouvez-vous commencer un nom de classe avec un chiffre numérique? que les espaces ne sont pas autorisés dans les identifiants et donc donc else if ne peut pas être un seul mot clé mais doit être deux mots clés distincts .

132
Shafik Yaghmour

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

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.

77
James Kanze

Non, ça ne l'est pas.
Ce sont deux mots-clés et, de plus, le deuxième "si" est une sous-déclaration "à l'intérieur" de la portée déterminée par la première instruction "else".

24
pablo1977

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 if et l'autre est else.

17
reindeer

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 la grammaire BNF qui traite les instructions if et else en 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 statement lui-même inclut selection-statement. Ainsi, des combinaisons comme:

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

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

Remarque: la grammaire C++ provient de la page this .

10
The Mask

else and if are two different C++ keywords . Une instruction if peut être suivie d'une option else if ... instruction else . Une instruction if peut avoir zéro ou plusieurs else if et doit précéder le sinon .

Vous pouvez trouver la syntaxe et l'exemple dans ce tutoriel if ... else

1
clever_bassi