11
votes

Deux "==" exploitants d'égalité dans la même condition "si" ne fonctionne pas comme prévu

J'essaie d'établir l'égalité de trois variables égales, mais le code suivant n'imprime pas la réponse correcte évidente qu'il devrait imprimer. Quelqu'un peut-il expliquer, comment le compilateur analyse le si (condition) code> interne? xxx pré>

sortie: p>

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


3 commentaires

Vous avez besoin ((i == j) && (j == k))


Vos tests d'édition Si i == 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 le comprendre: par exemple, quelle est la valeur de 1 == 2 ?


Prise en charge de la langue pour les opérateurs de comparaison chaînées (x


4 Réponses :


24
votes
 if ( (false) == (false) )

4 commentaires

@Manav, Non. Utilisez && entre les conditionnels.


Il est « bien » mais il n'a pas de sens. Cela dit "si l'égalité de i et j est le même que l'égalité de j et k ." Tous les trois étant différents, il serait vrai. Vous voulez && , ce qui signifie et.


Non. (I == J) == (j == k) équivaut à (i == j) ^ (j == k). Ce qui signifie qu'il sera vrai si j'étais == j et j == k ou si je! = j et j! = k. Parce que (i == j) renvoie une valeur vraie ou fausse.


@Surdin, ils ne sont pas équivalents, ils sont en fait tout à fait opposés (et seulement si j'ignore les types des résultats).



9
votes

Vous devez séparer les opérations:

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


0 commentaires

7
votes

J'aurais hébergé l'avertissement du compilateur et l'écrire comme (i == j) && (j == k) . Il faut plus de temps pour écrire mais cela signifie la même chose et n'est pas susceptible de faire se plaindre du compilateur.


4 commentaires

Juste pour être difficile, le compilateur est en fait un avertissement que vous êtes comparer une comparaison .


Bien que ce soit évidemment la signification manav voulue, ce n'est pas le changement que le compilateur a suggéré. L'attention de l'avertissement du compilateur vous donnerait ce code: (i == j) == k .


VRAI: Bien que le compilateur ait dit suggère des parenthèses autour de la comparaison dans l'opérande de '==' mais car cela n'a pas spécifié "== ', je viens de parent les deux! ;)


Plus important encore, il fait la bonne chose, tandis que i == j == k ne le fait pas.



8
votes

expression xxx

est analysé comme xxx

de sorte que vous comparez i à j < / code> et obtenir vrai . Que vous comparez true à 123 . true est converti en entier comme 1 . On n'est pas égal 123 , donc l'expression est false.

Vous avez besoin d'expression i == j && j == k < / p>


0 commentaires