2010-08-02 10 views
2

Avec l'exemple C++ suivant (l'indentation a été omise dans le but).Syntaxe du flux de contrôle en C++

if(condA)   // if #1 
if(condB)   // if #2 
if(condC)   // if #3 
if(condD)   // if #4 
funcA(); 
else if(condD)  // else #1 if #5 
funcB(); 
else if(condE)  // else #2 if #6 
funcC(); 
else    // else #3 
funcD(); 
else if(condF)  // else #4 if #7 
funcE(); 
else    // else #5 
funcF(); 

Qu'est-ce else fait référence à ce que if et ce qui est la règle à ce sujet? (oui je sais en utilisant { } va résoudre cela).

+1

Vous avez trébuché sur un problème connu sous le nom de problème dangling else. http://en.wikipedia.org/wiki/Dangling_else – riwalk

+0

sacrément trop de bonnes réponses et une seule qui peut être acceptée – Dani

+1

Découvrez qui est l'auteur original et l'accolades et le mettre en retrait. – dreamlax

Répondre

1

DeadMG a raison. Juste au cas où vous êtes intéressé, la règle est

else est attaché au dernier libre (qui est, non protégé par des accolades et sans autre correspondant) if.

5
if(condA)   // if #1 
    if(condB)   // if #2 
     if(condC)   // if #3 
      if(condD)   // if #4 
       funcA(); 
      else if(condD)  // else #1 if #5 
       funcB(); 
      else if(condE)  // else #2 if #6 
       funcC(); 
      else    // else #3 
       funcD(); 
     else if(condF)  // else #4 if #7 
      funcE(); 
     else    // else #5 
      funcF(); 
3

Chaque else se réfère toujours à l'intérieur le plus if possible.

Alors

if (a) 
if (b) B; 
else C; 

est équivalent à

if (a) { 
    if (b) B; 
    else C; 
} 
1

Ne pas écrire jamais code comme ceci dans un environnement de production. Ça va te mordre.

+0

Cela ressemble plus à un problème théorique, et très pratique lors de l'analyse des langues. – riwalk

+0

Cela m'a fait mordre, mais je n'ai pas écrit le code, et j'avais besoin de savoir ce que ça faisait. – Dani

+0

@Stargazer: Oui, vous avez raison, mais seulement pour ceux qui écrivent des langages de programmation. Ce qui est très peu de nous. @Dani: Ouch, je suis désolé que vous deviez maintenir ce code. Mes condoléances. :) –

0

Ce problème est appelé "Dangling else". La convention pour résoudre ceci est d'attacher l'instruction 'else' à l'instruction 'if' la plus proche.

Dangling else wikipedia

+0

La convention * résout * le problème du pendage. –

+0

Modifié donc cela n'implique pas l'inverse. – Jaime

0

C++ sait qui correspond à autre que si, et les compilateurs C ont des parseurs juste fines démerder en flash. Le problème est le vous ne sont pas bons à cela.

Exécutez ceci à travers un C++ prettyprinter et le texte au format résultat le rendra très clair.