2009-12-22 14 views
7

dicho que quiera poner a prueba no sólo una, sino varias variables para la equivalencia en una sentencia if: no parececómo probar la equivalencia de varias variables en C

if(x1==x2==y1==y2){ 
    printf("Input values shouldn't be equal!"); 
} 

Pero esto funcione. ¿Qué otro enfoque puede hacer esto?

+1

¿Quiere decir que 1, 1, 1, 1 no es válido, pero 1, 1, 1, 2 es válido o todos tienen que ser diferentes? – Xav

+0

1,1,1,1 no es válido, pero 1,1,1,2 es válido. Solo si todas las variables tienen el mismo valor, no es válido. – Fergus

Respuesta

0

No funciona porque (x1 == x2) evalúa el número 1, si es verdadero, y 0 si es falso, por cierto. (x1 == x2 == x3) termina evaluando como ((x1 == x2) == x3).

Tendría que escribir su propia función para hacer esto, creo.

+1

Rechazaría la explicación correcta, pero no requiere una función separada, se puede hacer en línea. –

+0

Mi comentario sobre la función era para una solución de propósito general, es decir, probar N cosas para la igualdad. Obviamente, puede escribir el caso variable 3 en línea. – M1EK

9
if(x1 == x2 && x2 == y1 && y1 == y2) { ... } 
+0

+1: es más fácil entender que el código los busca a todos iguales. –

10
if (x1 == x2 && x1 == y1 && x1 == y2) 
{ 
    printf("Input values shouldn't be equal!"); 
} 
-1

Su problema es el uso incorrecto del operador ==. Usted tendría que utilizar algo como:

if ((x1 == x2) && (x1 == y1) && (x1 == y2)) { 
    printf("Input values shouldn't be equal!"); 
} 
+1

El problema no es la precedencia, es que '==' no hace lo mismo en C que '=' en Lisp. Hacer que funcione de esa manera requeriría más que un cambio en la precedencia. –

+0

Actualicé mi respuesta, ¿mejor? –

+0

Mucho mejor, gracias. –

0

El siguiente código C debe responder a su pregunta:

if(x1==x2 && x1 == y1 && x1 == y2 && 
      x2==y1 && x2 == y2 && 
      y1 == y2) 
{ printf("Input values shouldn't be equal!"); } 
    return 0; 
} 
+2

Todo lo que necesita son 3 pruebas de igualdad, su expresión booleana se puede simplificar;) – AraK

+2

No es necesario comprobar las seis permutaciones. –

+2

sí, es exagerado ... pero s NO está mal! – warren

26
if (x1 == x2 && x2 == y1 && y1 == y2) { ... } 

El resultado de la expresión a == b habrá un valor entero de 0 ó 1 El operador == es de asociación izquierda, por lo que la expresión a == b == c se evaluará como (a == b) == c; es decir, el resultado de a == b (0 o 1) se comparará con el valor de c. Así que en el código de abajo

if (a == b == c) { ... } 

la expresión sólo se evaluará como true si a == b, c == 1 o! = B y c == 0.

+1

excelente !!! Solo desearía poder agregar más. – Dave

3

Aquí hay un enfoque diferente, usando una variable auxiliar (count_equals) para que sea fácil de hacer (y entienda) exactamente lo que desea.

int count_equals = 0; 
if (x1 == x2) count_equals++; 
if (x1 == y1) count_equals++; 
if (x1 == y2) count_equals++; 
if (x2 == y1) count_equals++; 
if (x2 == y2) count_equals++; 
if (y1 == y2) count_equals++; 

if (count_equals == 0) /* all values are different */; 
else if (count_equals == 6) /* all values are equal */; 
else /* some values are equal */; 
+0

Muy útil e ilustrativo. Gracias – Fergus

6

si son números enteros puede utilizar operaciones bit a bit:

if ((x1 & x2 & x3 & x4) == (x1 | x2 | x3 | x4)) 
    // all are equal 

Se evaluará a verdadero si y sólo si son todos los mismos

+0

realmente bueno! Pensé en algo similar, pero tú eres más rápido. –

1

Las soluciones presentadas aquí donde mayormente correcta y fácil de entender .

Pero yo preferiría el solution provided by Sany Huttunen:

citado:

if (x1 == x2 && x1 == y1 && x1 == y2) 
{ 
    printf("Input values shouldn't be equal!"); 
} 

Aquí es la razón por la:

Aunque parece no ser posible en este caso concreto se dirigieron inmediatamente a pensar en la refactorización, como en:

(a*b) + (a*c) + (a*d) 

que podría ser simplificado en

a*(b+c+d) 

como se ha mencionado que no es posible simplificar en este caso concreto, sin embargo, debido a

(a*b) + (a*c) + (a*d) 

sigue diferentes reglas matemáticas continuación

(a+b) * (a+c) * (a+d) 

Esto tiene algo que ver con reglas conmutativas, asociativas y distributivas si no recuerdo mal.

+0

Puntos extra para generalización. – Fergus

0

Aquí hay otro método que utiliza la lógica booleana

bool all_equal(false) 
all_equal = x1 == x2; 
all_equal = all_equal && (x2 == x3); 
all_equal = all_equal && (x3 == x4); 

Un buen compilador puede codificar esto utilizando las instrucciones de ensamblaje condicional y no perturbar la cola de captación previa de instrucciones.

Cuestiones relacionadas