js_*_*js_ 9 iphone boolean compare objective-c
我想比较objective-c中的2个BOOL值.
我发现以下代码的(3) - (6)有效.
(1) - (2)不起作用,因为BOOL是公正的signed char
.
(3)工作并且非常易读,但我认为bool
不是客观的.
使用bool
在Objective-C的代码是好的?
哪个是比较objective-c中的2个BOOL值的安全且好的方法?
还有其他更好的比较方法吗?
BOOL b = YES;
BOOL c = 2;
NSLog(@"(1) %d", b == c); // not work
NSLog(@"(2) %d", (BOOL)b == (BOOL)c); // not work
NSLog(@"(3) %d", (bool)b == (bool)c);
NSLog(@"(4) %d", !b == !c);
NSLog(@"(5) %d", !!b == !!c);
NSLog(@"(6) %d", (b != 0) == (c != 0));
Run Code Online (Sandbox Code Playgroud)
结果:
(1) 0
(2) 0
(3) 1
(4) 1
(5) 1
(6) 1
Run Code Online (Sandbox Code Playgroud)
比较两个布尔值应该使用XOR运算来处理.
试图直接比较两个布尔值是滥用布尔代数的基本原理:http: //en.wikipedia.org/wiki/Boolean_algebra_(logic)
当你在做的时候
BOOL a = (b == c);
Run Code Online (Sandbox Code Playgroud)
那么即使b和c都为真,这个值也可能返回false.但是,如果b和c都为真,即大于0,则表达式b && c将始终返回YES,否则返回NO.
相反,这是你实际上要做的事情:
BOOL xor = b && !c || !b && c;
BOOL equal = !xor;
Run Code Online (Sandbox Code Playgroud)
相当于
BOOL equal = !(b && !c || !b && c);
Run Code Online (Sandbox Code Playgroud)
要么
BOOL equal = (b && c) || (!b && !c)
Run Code Online (Sandbox Code Playgroud)
如果你必须花时间确保你的BOOL值被标准化(即设置为1或0),那么你做错了.
bool
在Objective-C中使用它是完全有效的,因为它是C99标准(第7.16节)的一部分.在我看来,这也是处理布尔类型安全比较的最佳方法.
不在bool
任何地方使用的唯一原因BOOL
是在Objective-C和框架中无处不在.