看Objective-C Runtime Reference时获知的。其实应该是很合理的东西,但是总觉得有点小神奇。
程序片段:
- (BOOL) guessReturnWhat_BOOL
{
return 256;
}
- (bool) guessReturnWhat_bool
{
return 256;
}
if([self guessReturnWhat_BOOL])
{
NSLog(@"of course YES");
} else{
NSLog(@"shit NO");
}
if([self guessReturnWhat_bool])
{
NSLog(@"of course true");
} else{
NSLog(@"shit false");
}
猜一下打印的log是什么样的?
2014-03-01 16:56:48.158 [64390:70b] sizeof(BOOL):1
2014-03-01 16:56:48.193 [64390:70b] sizeof(bool):1
2014-03-01 16:56:48.193 [64390:70b] shit NO
2014-03-01 16:56:48.194 [64390:70b] of course true
呵呵,shit!这里有个坑啊原来。。。
OC中,BOOL、YES、NO的定义如下:
typedef signed char BOOL;
#define YES ((BOOL)1)
#define NO ((BOOL)0)
BOOL和bool的字节数当然是相等的:sizeof(BOOL) == sizeof(bool)。但是BOOL这个signed char时,256显然溢出了,然后低8位全是0,然后返回了0。(当然只要低8位为0的任何可溢出数字结果都一样。)但是bool作为c/c++的内置类型就有点小神奇了,它做到了逻辑上的正确,干翻了数学上的正确。。
这里win32更狠,直接typedef int BOOL。呵呵。让你溢出。累死你。。。