2012-07-11 11 views
20

C'è un modo per inserire una condizione che restituisce true solo se uno dei due componenti restituisce true?XOR Objective-c

BOOL var1 
BOOL var2 

qualcosa di più breve di if((var1 && !var2) || (!var1 && var2))

Grazie

+7

è possibile utilizzare questo se (var1 var2 ^) – Siddiqui

risposta

54

Come Objective-C è un superset di C, è sufficiente utilizzare l'operatore XOR da C, che è ^.

+18

Questo è il XOR bit a bit, se si vuole una logica XOR, è sufficiente utilizzare '! ='. –

+2

Nessuna delle due soluzioni funzionerà sempre. A BOOL può essere qualsiasi intero. Entrambi falliranno se entrambi i valori sono diversi da zero, ma non uguali. L'opzione più valida è probabilmente quella di scriverlo completamente, come la domanda originale. –

+1

@DrewMcCormack, per evitare questo problema è possibile convertire qualsiasi tipo in vero 'BOOL' usando due punti esclamativi. '!! var1! = !! var2' – DanSkeel

42

XOR

if(!!var1 != !!var2) 
{ 
    NSLog(@"XOR condition"); 
} 

punti esclamativi convertono VAR di BOOL (conversione reale, non casting)
Quindi questa soluzione funziona anche se le variabili non sono BOOL.

!!(0|nil) ≡ 0 
!!(any other number|object) ≡ 1 

Questo è utile nei casi in cui si vuole essere sicuri che solo uno di Vars è nonnil.

+0

breve, elegante, facile e semplice – meronix

+0

Per impostazione predefinita, la variabile BOOL è NO. In questa condizione, penso che sia fallita. Check it –

+0

Mi piace questo ma a parte la carota potrebbe essere più accademico grazie per la risposta –

0

provare (int)var1^(int)var2 SI e NO sono in realtà definiti come segue:

#define YES (BOOL)1 
#define NO (BOOL)0 
0
if ((!var1)==var2) 
{ 
     NSLog(@"Yes"); 
} 
3

si potrebbe aggiungere più chiarezza al codice che Ishu suggerisce in questo modo:

#define XOR != 

e poi scrivi:

if (var1 XOR var2) { 

    ... 
} 

uscita tabella di verità:
[T XOR T => F; T! = T => F],
[T XOR F => T; T! = F => T],
[F XOR T => T; F! = T => T] e
[F XOR F => F; F! = F => F]

+0

Questo non è xo –

+0

@AlbertRenshaw Sì, perché risulta nella stessa tabella di verità: [T XOR T => F; T! = T => F], [T XOR F => T; T! = F => T], [F XOR T => T; F! = T => T] e [F XOR F => F; F! = F => F]. –

+1

Woah hai ragione. In realtà mi sento molto sciocco per non aver capito questo! Grazie per avermi insegnato –

2

Una macro potrebbe essere un'opzione. Manterrà lo stesso comportamento, ma ora in un modo più leggibile.

#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))

if(XOR(var1, var2) { 

} 
Problemi correlati