2010-01-28 2 views
10

J'essaie d'établir l'égalité de trois variables égales, mais le code suivant n'imprime pas la bonne réponse évidente qu'il devrait imprimer. Est-ce que quelqu'un peut expliquer, comment le compilateur analyse le donné if(condition) en interne?Deux opérateurs d'égalité '==' dans la même condition 'si' ne fonctionnent pas comme prévu

#include<stdio.h> 
int main() 
{ 
     int i = 123, j = 123, k = 123; 
     if (i == j == k) 
       printf("Equal\n"); 
     else 
       printf("NOT Equal\n"); 
     return 0; 
} 

Sortie:

[email protected]:~$ gcc -Wall -pedantic calc.c 
calc.c: In function ‘main’: 
calc.c:5: warning: suggest parentheses around comparison in operand of ‘==’ 
[email protected]:~$ ./a.out 
NOT Equal 
[email protected]:~$ 

EDIT:

Aller par les réponses ci-dessous, est la déclaration suivante d'accord pour vérifier l'égalité ci-dessus?

if ((i==j) == (j==k)) 
+1

Vous devez ((i == j) && (j == k)) –

+0

Vos tests modifier si je == j' 'a la même valeur que j' == K' . Que se passe-t-il pour 'i = 1',' j = 2', 'k = 3'? Ne devinez pas, essayez de comprendre: par exemple, quelle est la valeur de '1 == 2'? –

+0

[Prise en charge du langage pour les opérateurs de comparaison chaînés (x

Répondre

21
if ((i == j) == k) 

    i == j -> true -> 1 
    1 != 123 

Pour éviter que:

if (i == j && j == k) { 

Ne pas faire ceci:

if ((i==j) == (j==k)) 

Vous obtiendrez pour i = 1, j = 2, k = 1:

if ((false) == (false)) 

... d'où la mauvaise réponse;)

+0

Est codé comme si ((i == j) == (j == k)) d'accord ??? –

+1

@Manav, Non. Utiliser && entre les conditions. – jmucchiello

+0

C'est "bien" mais ça n'a aucun sens. Cela dit "si l'égalité de" i "et de" j "est la même que l'égalité de" j "et de" k "." Tous les trois étant différents le rendraient vrai. Vous voulez '&&', ce qui signifie et. – GManNickG

9

Vous devez séparer les opérations:

if (i == j && i == k) 
7

Je compte et écrire comme (i==j) && (j==k) l'avertissement du compilateur. Cela prend plus de temps à écrire mais cela signifie la même chose et ne risque pas de faire se plaindre le compilateur.

+1

Et c'est plus clair. La lisibilité est la clé. –

+0

Juste pour être pointilleux, le compilateur avertit que vous comparez une comparaison *. –

+0

Bien que ce soit manifestement le sens que Manav avait prévu, ce n'est pas le changement que le compilateur a suggéré. Tenir compte de l'avertissement du compilateur vous donnerait ce code: '(i == j) == k'. –

8

Expression

i == j == k 

est analysé comme

(i == j) == k 

Vous comparez i-j et obtenez true. Que vous comparez true à 123. true est converti en entier sous la forme 1. L'un n'est pas égal à 123, donc l'expression est fausse.

Vous avez besoin d'expression i == j && j == k

Questions connexes