Je suis récemment venu à accrocher du code C ++ comme ce qui suit: Ceci est ambigu, car le compilateur pouvait voir cela comme suit: p> if(test_1)
{
if(test_2)
{
}
}
else
{
}
5 Réponses :
Il est bien défini. sinon code> est toujours jumelé avec le le plus proche disponible si code>. p>
est le comportement de ce code défini selon n'importe quelle norme (C, C ++)? P>
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 p>
xxx pré> est correct. P> < / blockquote>
+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.
Il n'y a pas d'ambiguïté. La clause 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>
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):
if(test_1)
{
if(test_2)
{
// Do stuff
}
else
{
exit(0);
}
}
Il est défini dans C. Un sinon code> est toujours jumelé avec le plus proche si code>;
Par conséquent, vous devriez utiliser des accolades appropriées pour éviter toute ambiguïté. P>
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: p>
/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] forte>
Si (Job-> IsExpired () == FALSE) P>
G ++ (Raspbian 6.3.0-18 + RPI1 + Deb9u1) 6.3.0 20170516 P>
Ce n'est pas ambigu de i> comme la standard détermine comment il doit être analysé, il pourrait regarder i> 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 .