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
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
Come Objective-C è un superset di C, è sufficiente utilizzare l'operatore XOR da C, che è ^
.
Questo è il XOR bit a bit, se si vuole una logica XOR, è sufficiente utilizzare '! ='. –
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. –
@DrewMcCormack, per evitare questo problema è possibile convertire qualsiasi tipo in vero 'BOOL' usando due punti esclamativi. '!! var1! = !! var2' – DanSkeel
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.
breve, elegante, facile e semplice – meronix
Per impostazione predefinita, la variabile BOOL è NO. In questa condizione, penso che sia fallita. Check it –
Mi piace questo ma a parte la carota potrebbe essere più accademico grazie per la risposta –
provare (int)var1^(int)var2
SI e NO sono in realtà definiti come segue:
#define YES (BOOL)1
#define NO (BOOL)0
if ((!var1)==var2)
{
NSLog(@"Yes");
}
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]
Questo non è xo –
@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]. –
Woah hai ragione. In realtà mi sento molto sciocco per non aver capito questo! Grazie per avermi insegnato –
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) {
}
è possibile utilizzare questo se (var1 var2 ^) – Siddiqui