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

Dan*_*ark 6 primitive objective-c

在这里的评论 - /sf/answers/657519691/ - 我发现BOOLint值设置其值时有一些意外的行为.大多数情况下,如果将值设置为,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
Run Code Online (Sandbox Code Playgroud)

我认为这是奇怪,但还是那句话,我不从投intBOOL多少反正.然而:

  1. 这是否意味着bool优先考虑BOOL?为什么或者为什么不?
  2. 可以使用吗?

if (thatBool) {

    或者应该更喜欢

if (thatBool ? YES : NO) {

  为什么?

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

zou*_*oul 3

我认为(BOOL)4096被评估0是一个简单的算术溢出,就像(BOOL)256, 因为BOOL是一个unsigned char。我认为!!转换技巧(“双重否定”)效果很好:

\n\n
NSLog(@"%i", (BOOL)256); // 0\nNSLog(@"%i", !!256); // 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着 I\xe2\x80\x99d 用来BOOL保持标准的 Cocoa 编码风格并简单地监视危险的类型转换。这thatBool ? YES : NO表情让我眼睛疼,你为什么要这么做?:)

\n