2009-12-22 8 views
7

dire che ho voluto mettere alla prova non solo uno, ma diverse variabili per l'equivalenza in un'istruzione if:come verificare l'equivalenza delle diverse variabili in C

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

Ma questo non sembra funzionare. Quale altro approccio può fare questo?

+1

Vuoi dire che 1, 1, 1, 1 non è valido ma 1, 1, 1, 2 è valido, oppure devono essere tutti diversi? – Xav

+0

1,1,1,1 non valido, ma 1,1,1,2 è valido. Solo se tutte le variabili sono impostate sullo stesso valore non è valido. – Fergus

risposta

0

Non funziona perché (x1 == x2) restituisce il numero 1, se vero, e 0 se falso, tra l'altro. (x1 == x2 == x3) finisce per valutare come ((x1 == x2) == x3).

Avresti bisogno di scrivere la propria funzione per fare questo, credo.

+1

Per la spiegazione corretta, passerà in rassegna, ma non richiede una funzione separata, può essere eseguito in linea. –

+0

Il mio commento sulla funzione era per una soluzione generica, cioè prova N cose per l'uguaglianza. Ovviamente puoi scrivere le 3 variabili in linea. – M1EK

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

+1: Più facile capire che il codice cerca tutti uguali. –

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

Il tuo problema è l'uso scorretto dell'operatore ==. Si avrebbe bisogno di usare qualcosa come:

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

Il problema non è la precedenza, è che '==' non fa la stessa cosa in C come '=' fa in Lisp. Farlo funzionare in questo modo richiederebbe più di un cambiamento di precedenza. –

+0

Aggiornato la mia risposta, meglio? –

+0

Molto meglio, grazie. –

0

Il seguente codice C dovrebbe rispondere alla tua domanda:

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

Tutto ciò di cui hai bisogno sono 3 test di uguaglianza, la tua espressione booleana può essere semplificata;) – AraK

+2

Non è necessario controllare tutte e sei le permutazioni. –

+2

sì, è esagerato .. ma è s sbagliato! – warren

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

Il risultato dell'espressione a == b sarà un valore intero di 0 o 1 . l'operatore == è lasciato associativo, quindi l'espressione a == b == c verrà valutato come (a == b) == c; ovvero, il risultato di a == b (0 o 1) verrà confrontato con il valore di c. Quindi, nel seguente codice

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

l'espressione valuterà solo vero se un b == c == 1 o! = B, c == 0.

+1

eccellente !!! Vorrei solo poter aggiungere altro. – Dave

3

Ecco un approccio diverso, utilizzando una variabile aiutante (count_equals) in modo che sia facile da fare (e capire) esattamente quello che vuoi.

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

Molto utile e illustrativo. Grazie – Fergus

6

se sono numeri interi è possibile utilizzare operazioni bit per bit:

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

Sarà valutata come vera IFF sono tutti gli stessi

+0

davvero bello! Ho pensato a qualcosa di simile - ma tu dove più veloce. –

1

Le soluzioni presentate qui, dove per lo più corrette e facili da capire .

Ma io preferirei il solution provided by Sany Huttunen:

citato:

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

Ecco il motivo per cui:

Anche se sembra non essere possibile in questo caso concreto che mi ha indirizzato immediatamente a pensare al refactoring, come in:

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

che potrebbe essere semplificata in

a*(b+c+d) 

come detto non è possibile semplificare in questo caso concreto però, perché

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

segue differenti regole matematiche poi

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

Questo deve qualcosa a che fare con le regole commutative, associative e distributive se ricordo bene.

+0

Punti extra per generalizzazione. – Fergus

0

Ecco un altro metodo che utilizza la logica booleana

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

Un buon compilatore in grado di codificare questo utilizzando istruzioni di montaggio condizionale e non disturbare la coda di istruzioni di prefetch.

Problemi correlati