int值的含义不是“拟合” - 对于Objective-C,bool或BOOL?

时间:2012-02-24 15:16:43

标签: objective-c primitive

在此处的评论中 - 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。但是:

  1. 这是否意味着bool首选BOOL?为什么或为什么不呢?
  2. 可以使用
  3. if (thatBool) {

    或者应该更喜欢

    if (thatBool ? YES : NO) {

    为什么?

    注意:这是此问题的更具体版本 - Objective-C : BOOL vs bool - 但我认为它增加了它并且不重复。

3 个答案:

答案 0 :(得分:3)

我认为(BOOL)4096被评估为0是一个简单的算术溢出,就像(BOOL)256一样,因为BOOLunsigned 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;把它变成一个真/假的陈述。