如何将指针转换为BOOL返回112?

时间:2012-10-09 21:22:35

标签: objective-c

假设我有一个指向某个对象的指针,称为myObject,我需要知道它是否真的指向某个东西。这段代码怎么样:

// assume MyObjectClass *myObject;
return (BOOL)myObject;

返回 112 ?我知道,我总是可以写

return (myObject == nil);

一切都会好的。但直到今天我一直认为,将任何明确地转换为bool将总是返回truefalse(据我所知, 0总是被视为false而任何其他值被视为true),而带有YESNO值的BOOL只是“重命名”bool。所以基本上,我的问题是:

  • 为什么回归112? : - )
  • 是否在C / Objective-C标准中定义了显式转换的结果,还是编译器特定的?

3 个答案:

答案 0 :(得分:4)

在Objective-C中,BOOL宏只是typedef的{​​{1}} signed charYES / NO已定义,但bool是实际的布尔值,可以是truefalse

它返回112,因为它将指针的地址舍入为signed char类型。

以下是一些有良好答案的讨论:
Objective-C : BOOL vs bool
Is there a difference between YES/NO,TRUE/FALSE and true/false in objective-c?

答案 1 :(得分:1)

C中“true”的定义是任何非零数字。因此,就C而言,112将被认为是真实的。从C99标准:

  

6.3.1.2布尔类型

     

当任何标量值转换为_Bool时,如果值比较相等,则结果为0   到0;否则,结果是1。

您的值未转换为1,因为您要转换为BOOL而不是_Bool。转换为0/1将在if内部进行技术处理(尽管实际上在任何if / while类型语句中实现更可能是(myObject!= 0))。

答案 2 :(得分:1)

在C中,bool是布尔类型stdbool.h的{​​{1}}宏。

将非零整数值转换为_Bool可确保产生_Bool

也就是说,1的结果是1 == (bool) 42

如果您使用1类型作为另一个整数类型的别名(如BOOL),则可以得到不同的结果:

signed char的结果是1 == (BOOL) 42