假设我有一个指向某个对象的指针,称为myObject
,我需要知道它是否真的指向某个东西。这段代码怎么样:
// assume MyObjectClass *myObject;
return (BOOL)myObject;
返回 112 ?我知道,我总是可以写
return (myObject == nil);
一切都会好的。但直到今天我一直认为,将任何明确地转换为bool将总是返回true
或false
(据我所知, 0总是被视为false
而任何其他值被视为true
),而带有YES
和NO
值的BOOL只是“重命名”bool。所以基本上,我的问题是:
答案 0 :(得分:4)
在Objective-C中,BOOL
宏只是typedef
的{{1}} signed char
,YES
/ NO
已定义,但bool
是实际的布尔值,可以是true
或false
。
它返回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
。