【问题标题】:Objective-C pointers as booleansObjective-C 指针作为布尔值
【发布时间】:2012-04-04 06:13:53
【问题描述】:

浏览一些关于修改 CGImageRef 数据的文档时,我遇到了一个奇怪的例子——它类似于这个伪代码:

void *data = Allocate space for data;
if (data != NULL) Manipulate data;
if (data) Free data;

这让我很疑惑!布尔运算if (data != NULL)和布尔运算if (data)有什么区别。

更具体地说,当指针被视为布尔值时,指针在 Objective C 中的行为如何?尝试用谷歌搜索这个,我只发现了无数与指针-to-布尔值相关的问题,而不是被评估为 布尔值的指针。

【问题讨论】:

    标签: objective-c pointers boolean evaluation


    【解决方案1】:

    它们完全一样。任何类型的非零值在 C 中被解释为“真”,并在 Objective-C 中被扩展。 C 甚至没有 布尔类型。

    【讨论】:

    • 哦,因为 NULL 可以被视为指向位置 0 的指针,所以它被评估为假...明白了,谢谢! :)
    • 请不要将 NULL 视为“指向位置 0 的指针”之类的任何东西。它只是不指向任何东西的指针的约定值。当强制为布尔值时,它等同于假。当你强制一个指针为零时,你会得到 NULL。
    • @GeorgesOatesLarsen:空指针不一定是指向内存位置 0 的指针。根据 C 规范,空指针保证与任何有效指针不相等。在某些平台上,内存位置 0 可能是有效的(例如,它可能是中断处理程序表中的第一个条目)。但是,空指针与整数值 0 相互转换,因此空指针被解释为假值。见 C99, § 6.3.2.3 3.
    • 事实上 >=C99 在stdbool.h中定义了布尔类型
    • @DavidSchwartz 我不知道 NULL 可以在内部存储为非零!尽管如此,我发现由于所有这些自动转换,NULL 仍然可以认为指向位置 0。这只是一种简单的思考方式,并没有真正影响编程过程。
    猜你喜欢
    • 2013-11-29
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多