2010-12-07 12 views
11

¿Puedo comparar tres variables como la siguiente, en lugar de hacer if((x==y)&&(y==z)&&(z=x))? [La instrucción if se debería ejecutar si las tres variables tienen el mismo valor. Estos son booleanos.]En C, ¿se comporta (x == y == z) lo que yo esperaría?

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

-1 para no pasar 30 segundos para escribir un programa de prueba para averiguar. –

+4

./shrug Estoy más interesado en entender por qué no funciona. Gracias a todos. – Isaac

Respuesta

33

No, no lo hace.

x == y se convierte a int, los rendimientos 0 o 1, y el resultado se compara con z. Así x==y==z producirá cierto si, y sólo si (x is equal to y and z is 1) or (x is not equal to y and z is 0)

Lo que se quiere hacer es

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

Casi creo que gcc debería generar una advertencia para esto, pero si escribes 'x == y == z' parece indicar que o no conoces C o eres un dios del código golf ... –

+0

Gracias. Aprecio la ayuda. – Isaac

+5

Cuando se compila con '-Wall', gcc produce una advertencia para tal construcción:' advertencia: sugiere paréntesis alrededor de la comparación en el operando de '==' ' – Kamal

6

Nº Los asociados de comprobación de igualdad desde la izquierda y el resultado lógico es comparada como una serie, por lo que la expresión 2 == 2 == 1 analiza como (2 == 2) == 1, que a su vez da 1 == 1 y resulta en 1, que probablemente no es lo que desea.

1

En realidad se puede escribir algo como esto:

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