2

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

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

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

return (myObject == nil);

一切都会好起来的。但是直到今天我一直假设,将任何东西显式转换为 bool总是会返回truefalse(据我所知,0 总是被认为是false,任何其他值都被认为是true)并且带有它的 BOOLYESNO值只是“重命名” bool . 所以基本上,我的问题是:

  • 为什么返回 112?:-)
  • 显式转换的结果是在 C/Objective-C 标准中的某个地方定义的,还是特定于编译器的?
4

3 回答 3

4

在 Objective-C 中,BOOL宏只是一个typedeffor signed charwith YES/ NOdefined,但bool它是一个实际的布尔值,可以是trueor false

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

以下是一些有很好答案的讨论:
Objective-C : BOOL vs bool
在objective-c 中YES/NO,TRUE/FALSE 和true/false 之间有区别吗?

于 2012-10-09T21:27:18.983 回答
1

C中“真”的定义是任何非零数。因此,就 C 而言,112 将被认为是正确的。来自 C99 标准:

6.3.1.2 布尔类型

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

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

于 2012-10-09T21:24:53.017 回答
1

在 C 中,boolstdbool.h布尔类型的宏_Bool

并且保证将非零整数值转换_Bool为 yield 1

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

如果你使用一个BOOL类型作为另一个整数类型的别名(比如signed char),你会得到不同的结果:

结果1 == (BOOL) 420

于 2012-10-09T21:29:43.367 回答