2012-02-24 50 views
6

在这里的评论 - https://stackoverflow.com/a/9393138/8047 - 我发现BOOL有一些意想不到的行为时,从int值设置它的值。大多数情况下,如果该值设置为0x1000,则会评估为FALSE(令人惊讶)。int值的含义不是“拟合” - bool或BOOL是否为Objective-C?

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. 是不是还好用

if (thatBool) {

       或一个应该更喜欢

if (thatBool ? YES : NO) {

   为什么呢?

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

回答

3

我认为(BOOL)4096被评估为0是一个简单的算术溢出,就如同(BOOL)256,因为BOOLunsigned char。而且我认为,!!铸造技巧(“双重否定”)正常工作:

NSLog(@"%i", (BOOL)256); // 0 
NSLog(@"%i", !!256); // 1 

这意味着我会使用BOOL保持标准的Cocoa编程风格,只是看着危险类型转换。 thatBool ? YES : NO表达伤害了我的眼睛,你为什么要这么做? :)

+0

'!!'铸造技巧上的任何链接?这些东西有点难以搜索:) – 2012-02-24 16:20:17

+0

这是一个简单的[双重否定](http://www.google.com/search?q=c+double+negation),应该更容易搜索。 – zoul 2012-02-24 16:28:30

+0

谢谢@zoul,很简单。我认为'注意危险类型'是正确的。 – 2012-02-24 20:38:40

2

1)bool是C++类型,BOOL是Objective-C之一。 从intBOOL的投射效果不正常,因为YES只是(BOOL)1 = (signed char)1(= 0x001),并且不等于(signed char)4(= 0x100)。

2)两者都可以工作,对于编程经验不多的人来说,第二种可能无法读取。我更喜欢使用左侧常量的旧式c型安全条件检查,以防意外遗漏其中一个等号。

if (YES == isEnabled) { 

} 
+2

只要加上“if(thatBool?YES:NO){“没用,只是一个if if(ifception!),这是一样的事情 – fbernardo 2012-02-24 15:35:03

+1

我喜欢Yoda如果风格,我总是想象程序员真的会这样说,它只是搞笑:) – JustSid 2012-02-24 15:38:40

+0

这实际上很实际:-D – Alexander 2012-02-24 15:39:37

0

使用int时,通过检查int是否等于某个特定值(例如,)来设置BOOL时,您始终可以是显式的。

BOOL yesNo = ((int)4096 > 0); 
BOOL enableButton = (someInt >= 16); 

换句话说,不要直接将int传递给BOOL;将其变为真/假陈述。