2012-07-11 27 views
20

¿Hay alguna manera de establecer una condición que devuelva verdadero solo si uno de los dos componentes devuelve verdadero?Objetivo XOR-c

BOOL var1 
BOOL var2 

algo más corto que if((var1 && !var2) || (!var1 && var2))

Gracias

+7

puede utilizar esto si (var1 var2 ^) – Siddiqui

Respuesta

54

Como Objective-C es un superconjunto de C, sólo tiene que utilizar el operador XOR de C, que es ^.

+18

Ese es el XOR bit a bit, si quieres una lógica XOR, basta con utilizar '! = '. –

+2

Ninguna solución funcionará todo el tiempo. Un BOOL puede ser cualquier número entero. Ambos fallarán si ambos valores son distintos de cero, pero desiguales. La opción más robusta es, probablemente, escribirla en su totalidad, como la pregunta original. –

+1

@DrewMcCormack, para evitar este problema puede convertir cualquier tipo a 'BOOL' real usando dos signos de admiración. '!! var1! = !! var2' – DanSkeel

42

XOR

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

Los signos de exclamación convierten a VARs BOOL (conversión real, no casting)
Así que esta solución funciona incluso si sus variables no son BOOL.

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

Esto es útil en los casos en los que desea asegurarse de que solo uno de los vars es nonnil.

+0

corto, elegante, fácil y simple – meronix

+0

Por defecto la variable BOOL es NO. En esta condición, creo que es un fracaso. Verifíquelo –

+0

Me gusta este por cierto pero la zanahoria puede ser más académica gracias a la respuesta –

0

tratar (int)var1^(int)var2 SÍ y NO en realidad están definidos de la siguiente manera:

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

Se podría añadir más claridad al código que Ishu sugiere al hacer esto:

#define XOR != 

y luego simplemente escribe:

if (var1 XOR var2) { 

    ... 
} 

salida de tabla de verdad:
[T XOR T => F; T! = T => F],
[T XOR F => T; T! = F => T],
[F XOR T => T; F! = T => T] y
[F XOR F => F; F! = F => F]

+0

Esto no es xor –

+0

@AlbertRenshaw Sí, lo es, porque da como resultado la misma tabla de verdad: [T XOR T => F; T! = T => F], [T XOR F => T; T! = F => T], [F XOR T => T; F! = T => T] y [F XOR F => F; F! = F => F]. –

+1

Woah, tienes razón. De hecho, me siento muy tonto por no darme cuenta de esto. Gracias por enseñarme –

2

Una macro podría ser una opción. Mantendrá el mismo comportamiento, pero ahora de una manera más legible.

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

if(XOR(var1, var2) { 

}