6
votes

Ambigue si et d'autres branches: le comportement est-il défini?

Je suis récemment venu à accrocher du code C ++ comme ce qui suit: XXX PRE>

Ceci est ambigu, car le compilateur pouvait voir cela comme suit: p>

if(test_1)
{
    if(test_2)
    {
    }
}
else
{
}

c c++

2 commentaires

Ce n'est pas ambigu de comme la standard détermine comment il doit être analysé, il pourrait regarder ambiguë pour vous, mais ce n'est pas au compilateur ou aux autres programmeurs qui savent comment il est analysé.


Vous voudrez peut-être lire ceci: en.wikipedia.org/wiki/dangling_else et ceci: < Un href = "http://drdobbs.com/blogs/cpp/231602010" rel = "nofollow noreferrer"> drdobbs.com/blogs/cpp/231602010 .


5 Réponses :


1
votes

Il est bien défini. sinon est toujours jumelé avec le le plus proche disponible si .


0 commentaires

13
votes

est le comportement de ce code défini selon n'importe quelle norme (C, C ++)?

Oui, c'est défini. En C (et toutes langues similaires que je sais), le "pendling sinon" se lie au dernier libres si, donc cette interprétation xxx

est correct. < / blockquote>


1 commentaires

+1 Mais comme une note (à l'OP), beaucoup considèrent un bon style d'écriture pour toujours toujours mettre des accolades pour cette (et d'autres) raisons. Pas pour l'ambiguïté du compilateur (non existant) mais pour l'ambiguïté et la stupidité humaines.



4
votes

Il n'y a pas d'ambiguïté. La clause sinon code> fait toujours référence au le plus proche si code> il peut être attaché à. De C ++ Standard (6.4 Déclarations de sélection):

Dans la clause 6, le remplacement du terme désigne la déclaration contenue ou les énoncés figurant dans la notation de la syntaxe. Le remplacement d'une instruction de sélection (chaque substantiement, sous forme d'entité de la déclaration IF) définit implicitement une portée locale (3.3). P>

Si le remplacement d'une sélection de sélection est une déclaration unique et non une déclaration composée, il est comme s'il était réécrit comme une instruction composée contenant le substantiement d'origine. [Exemple: p>

if(test_1)
{
    if(test_2)
    {
        // Do stuff
    }
    else
    {
        exit(0);
    }
}


0 commentaires

0
votes

Il est défini dans C. Un sinon est toujours jumelé avec le plus proche si ; Par conséquent, vous devriez utiliser des accolades appropriées pour éviter toute ambiguïté.


0 commentaires

0
votes

Oui, c'est non ambigu, car les règles indiquent l'endroit où elle est appliquée, mais mon compilateur GCC C ++ donne toujours un avertissement indiquant qu'il s'agit de:

/brainmodule/brainmodule.cpp: en fonction de la fonction 'void échecexpiredpendingRunning ()': ../brainmodule/brairmodule.cpp:158:16: AVERTISSEMENT: Suggérez des accolades explicites pour éviter toute ambiguë »d'autre» [-wparentheses] Si (Job-> IsExpired () == FALSE)

G ++ (Raspbian 6.3.0-18 + RPI1 + Deb9u1) 6.3.0 20170516


0 commentaires