在此处的评论中 - https://stackoverflow.com/a/9393138/8047 - 我发现BOOL
在从int
值设置其值时会有一些意外行为。大多数情况下,如果该值设置为0x1000
,则会将其评估为FALSE
(令人惊讶)。
NSLog(@"All zero? %d %d", (BOOL)0, (bool)0);
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097);
Produces:
All zero? 0 0
All one? -1 0 1
All one? 1 1 1
我认为这很奇怪,但话又说回来,无论如何我都不会从int
投射到BOOL
。但是:
bool
首选BOOL
?为什么或为什么不呢? if (thatBool) {
或者应该更喜欢
if (thatBool ? YES : NO) {
为什么?
注意:这是此问题的更具体版本 - Objective-C : BOOL vs bool - 但我认为它增加了它并且不重复。
答案 0 :(得分:3)
我认为(BOOL)4096
被评估为0
是一个简单的算术溢出,就像(BOOL)256
一样,因为BOOL
是unsigned char
。而且我认为!!
施法技巧(“双重否定”)可以正常工作:
NSLog(@"%i", (BOOL)256); // 0
NSLog(@"%i", !!256); // 1
这意味着我会使用BOOL
来保持标准的Cocoa编码风格,并只是观察危险的类型转换。 thatBool ? YES : NO
表达伤害了我的眼睛,你为什么要那样做? :)
答案 1 :(得分:2)
1)bool
是C ++类型,BOOL
是Objective-C类型。
从int
投射到BOOL
无法正常投放,因为YES
只是(BOOL)1
= (signed char)1
(= 0x001)并且不等于{{例如,1}}(= 0x100)。
2)两者都可以工作,第二部分对于编程经验不足的人来说可能是不可读的。我更喜欢旧的c式安全状态检查和左边的常数,以防止意外遗漏其中一个等号。
(signed char)4
答案 2 :(得分:0)
使用int时,通过检查int是否等于特定值来设置BOOL时,总是可以显式,例如
BOOL yesNo = ((int)4096 > 0);
BOOL enableButton = (someInt >= 16);
换句话说,不要直接将int传递给BOOL;把它变成一个真/假的陈述。