【发布时间】:2012-07-11 00:33:32
【问题描述】:
有没有办法设置一个仅当两个组件之一返回 true 时才返回 true 的条件?
BOOL var1
BOOL var2
比if((var1 && !var2) || (!var1 && var2))短的东西
谢谢
【问题讨论】:
-
你可以使用这个 if(var1 ^ var2)
标签: iphone objective-c logic
有没有办法设置一个仅当两个组件之一返回 true 时才返回 true 的条件?
BOOL var1
BOOL var2
比if((var1 && !var2) || (!var1 && var2))短的东西
谢谢
【问题讨论】:
标签: iphone objective-c logic
由于 Objective-C 是 C 的超集,您只需使用 C 中的 XOR 运算符,即^。
【讨论】:
!=。
BOOL。 !!var1 != !!var2
异或
if(!!var1 != !!var2)
{
NSLog(@"XOR condition");
}
感叹号将 var 转换为 BOOL(真正的转换,而不是强制转换)
因此,即使您的变量不是 BOOL,此解决方案也有效。
!!(0|nil) ≡ 0
!!(any other number|object) ≡ 1
这在您想确保只有一个 vars 是非空的情况下很有用。
【讨论】:
您可以通过这样做为 Ishu 建议的代码添加更多清晰:
#define XOR !=
然后你就写:
if (var1 XOR var2) {
...
}
真值表输出:
[T XOR T => F; T != T => F],
[T XOR F => T; T != F => T],
[异或 T => T; F != T => T] 和
[F XOR F => F; F != F => F]
【讨论】:
宏可能是一个选项。它将保持相同的行为,但现在以更易读的方式。
#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))
if(XOR(var1, var2) {
}
【讨论】:
试试(int)var1 ^ (int)var2
YES 和 NO 实际上定义如下:
#define YES (BOOL)1
#define NO (BOOL)0
【讨论】:
if ((!var1)==var2)
{
NSLog(@"Yes");
}
【讨论】: