2010-01-28 11 views
10

Estoy tratando de establecer la igualdad de tres variables iguales, pero el siguiente código no imprime la respuesta correcta obvia que debe imprimir. ¿Alguien puede explicar cómo el compilador está analizando internamente el if(condition) dado?Dos '==' operadores de igualdad en la misma condición 'si' no funcionan como se pretende

#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; 
} 

Salida:

[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:

A juzgar por las respuestas dadas a continuación, es la siguiente declaración bien para comprobar por encima de la igualdad?

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

que necesita ((i == j) && (j == k)) –

+0

tu edición pruebas si 'i == J' tiene el mismo valor que' j == K' . ¿Qué sucede para 'i = 1',' j = 2', 'k = 3'? No adivine, intente averiguarlo: por ejemplo, ¿cuál es el valor de '1 == 2'? –

+0

[Soporte de idioma para operadores de comparación encadenados (x

Respuesta

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

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

Para evitar que:

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

¿No hacer esto:

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

Obtendrá para i = 1, j = 2, k = 1:

if ((false) == (false)) 

... por lo tanto, la respuesta equivocada;)

+0

Está codificando como si ((i == j) == (j == k)) bueno ??? –

+1

@Manav, No. Use && entre los condicionales. – jmucchiello

+0

Está "bien", pero no tiene sentido. Dicho esto, "si la igualdad de' i' y 'j' es igual a la igualdad de' j' y 'k'." Los tres siendo diferentes lo harían verdad. Quieres '&&', que significa y. – GManNickG

9

Es necesario separar las operaciones de:

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

me presto atención a la advertencia del compilador y escribo como (i==j) && (j==k). Lleva más tiempo escribir, pero significa lo mismo y no es probable que haga que el compilador se queje.

+1

Y es más claro. La legibilidad es la clave. –

+0

Solo para ser exigente, el compilador en realidad está advirtiendo que estás * comparando una comparación *. –

+0

Aunque ese es obviamente el significado de Manav, ese no es el cambio sugerido por el compilador. Prestar atención a la advertencia del compilador le daría este código: '(i == j) == k'. –

8

Expresión

i == j == k 

se analiza como

(i == j) == k 

Así se compara i-j y obtener true. Luego de comparar true a 123. true se convierte a un número entero como 1. Uno no es igual a 123, por lo que la expresión es falsa.

Es necesario expresión i == j && j == k

Cuestiones relacionadas