2013-03-05 4 views
-1

J'écris un code simple pour imprimer itérativement un arbre binaire en post-ordre, mais je suis tombé sur cette étape de débogage bizarre:condition d'égalité Triple apporte résultat bizarre

enter image description here

L'image n'a pas photoshopped ou modifié de quelque façon que ce soit, la fenêtre "Locals" montre que les deux pointeurs ont des valeurs différentes mais en les comparant à eux-mêmes et à NULL, l'égalité retourne true et "Wat ??" est imprimé, comment ça se fait?

Ai-je raté quelque chose?

Si je réécris comme

if(pointer1 == NULL && pointer2 == NULL) 
    cout << "This won't be printed"; 

fonctionne correctement

+0

duplication possible de [Vérifier si toutes les variables sont égales à la même valeur en C++] (http://stackoverflow.com/questions/15208831/check-to-see-if-all-variable-are-equal -à-la-même-valeur-en-c) –

Répondre

9

L'opérateur de comparaison de l'égalité (operator ==) est un opérateur binaire qui associe à la gauche. Par conséquent, votre condition:

pointer1 == pointer2 == NULL

devient:

(pointer1 == pointer2) == NULL, qui devient soit:

true == NULL si (pointer1 == pointer2); ou

false == NULL si (pointer1 != pointer2).

Depuis NULL convertit en booléen false, cette condition est évaluée à true si et seulement si pointer1 != pointer2.

Comme vous pouvez le voir, ce qui est très différent de:

(pointer1 == NULL && pointer2 == NULL) 

qui évalue à true si et seulement si ni pointer1 ni pointer2 sont NULL.

+0

Je me sens stupide en ce moment, mais je suppose que je devrais certainement apprendre de cette erreur. Je vous remercie! –

+0

@JohnnyPauling: Nous avons tous été là ;-) –

1

Il fonctionne comme ceci

le compilateur vérifie d'abord, pointer1 == pointer2, ce qui est faux (valeur entière 0). Maintenant, ce résultat, 0, est vérifié avec NULL, qui est également nul. Par conséquent, il retourne vrai.