2010-12-07 6 views
11

Puis-je comparer trois variables comme suit, au lieu de faire if((x==y)&&(y==z)&&(z=x))? [L'instruction if doit s'exécuter si les trois variables ont la même valeur. Ce sont booléens.]En C, est-ce que (x == y == z) se comporte comme je m'y attendais?

if(debounceATnow == debounceATlast == debounceATlastlast) 
{ 
debounceANew = debounceATnow; 
} 
else 
{ 
debounceANew = debounceAOld; 
} 
+17

-1 pour ne pas passer 30 secondes à écrire un programme de test pour le savoir. –

+4

./shrug Je suis plus intéressé à comprendre pourquoi cela ne fonctionne pas. Merci tout le monde. – Isaac

Répondre

33

Non, il ne fonctionne pas.

x == y est converti en int, les rendements 01 ou, et le résultat est comparé à z. Alors x==y==z donnera vrai si et seulement si (x is equal to y and z is 1) or (x is not equal to y and z is 0)

Qu'est-ce que vous voulez faire est

if(x == y && x == z) 
+7

Je pense presque que gcc devrait générer un avertissement pour cela, mais encore une fois si vous écrivez 'x == y == z' cela semble indiquer que vous ne connaissez pas du tout C ou que vous êtes un dieu du code golf ... –

+0

Merci. J'apprécie l'aide. – Isaac

+5

Lorsqu'il est compilé avec '-Wall', gcc produit un avertissement pour une telle construction:' warning: suggérer des parenthèses autour de la comparaison dans l'opérande de '==' ' – Kamal

6

Non. Les associés de contrôle de l'égalité de la gauche et le résultat logique est comparé comme un nombre, de sorte que l'expression 2 == 2 == 1 analyse (2 == 2) == 1, ce qui à son tour donne 1 == 1 et aboutit à 1, ce qui n'est probablement pas ce que vous voulez.

1

Vous pouvez réellement taper quelque chose comme ceci:

int main() 
{ 
     const int first = 27, 
        second = first, 
        third = second, 
        fourth = third; 
     if (!((first & second & third)^fourth)) 
      return 1; 
     return 0; 
} 
Questions connexes