object-c的BOOL游戏

博客内容揭示了在Objective-C中,BOOL类型的定义和其潜在的溢出问题。通过程序输出展示了BOOL与bool在字节数相同的情况下,BOOL在特定情况下可能会导致逻辑错误。文章指出,BOOL是signed char类型,而bool作为C/C++的内置类型,虽然字节数相同,但在逻辑上保持了正确性。
摘要由CSDN通过智能技术生成

看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。呵呵。让你溢出。累死你。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值