为啥在检查符号是不是存在时不能使用否定运算符?

Posted

技术标签:

【中文标题】为啥在检查符号是不是存在时不能使用否定运算符?【英文标题】:Why cannot we use the negation operator when checking for the existence of a symbol?为什么在检查符号是否存在时不能使用否定运算符? 【发布时间】:2016-01-06 05:35:41 【问题描述】:

question 的答案表明if (x != nil)if (x) 相同。

但是Apple documentation 写着:

注意:在检查符号是否存在时,您必须在代码中明确地将其与 NULL 或 nil 进行比较。您不能使用否定运算符 (!) 来否定符号的地址。

这似乎与https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW22 中的“使用 nil”相矛盾

【问题讨论】:

您是否尝试过否定(!)来检查符号的存在?它会抛出什么错误? @RajeevRanjan 没有错误,它对我有用。因此,Apple 文档令人困惑。 好的。所以它符合我的猜测。 【参考方案1】:

文档说明您不能否定该地址。换句话说,你不能这样做:

if (!MyWeakLinkedFunction) 
    // symbol doesn't exist

您必须改为:

if (MyWeakLinkedFunction == NULL) 
    // symbol doesn't exist

但是,这两种方法都有效:

if (MyWeakLinkedFunction) 
    // symbol exists

或:

if (MyWeakLinkedFunction != NULL) 
    // symbol exists

【讨论】:

所以,尽管NULL 被(很可能)定义(void*) 0,但将否定运算符应用于它并不会给出评估为true 的东西? @NicolasMiari 我不明白你的问题。在我的答案中,否定运算符不适用于NULL 我只是假设如果MyWeakLinkedFunction == NULL 的计算结果为true,那么MyWeakLinkedFunction 实际上应该是NULL(又名0),否定它会得到true。我的意思是,仍然不清楚为什么 ! MyWeakLinkedFunction 没有意义/不允许。 @NicolasMiari 我不是 100% 确定,但我认为这与它是对弱链接函数的存在的运行时检查有关,因此否定不能正常工作人们可能期望使用“正常”指针。 我明白了。我不知道编译时/运行时弱链接的所有实现细节,但读起来会很有趣。我会做一些研究...【参考方案2】:

IMO,我们可能只是想多了。

在检查符号是否存在时,必须显式 将其与代码中的 NULL 或 nil 进行比较。

这部分只说 - 如果你想检查存在(而不是不存在),你必须明确比较NULLNIL

您不能使用否定运算符 (!) 来否定 符号。

如果你成功否定了符号的地址,它只是你成功地检查了不存在(而不是存在)。

当我遇到以下情况时,我认为这可能是一种可能性,因为他们使用了可用性这个词here -

注意:要检查函数的可用性,请显式比较其 地址为 NULL 或 nil。您不能使用否定运算符 ( ! ) 否定函数的地址以检查其可用性。另外,请注意 C 函数的名称与其地址是同义词。那是, &myFunction 等价于 myFunction。

【讨论】:

以上是关于为啥在检查符号是不是存在时不能使用否定运算符?的主要内容,如果未能解决你的问题,请参考以下文章

如果 Ascii 运算符是可定义的,为啥不是 Unicode 符号?

否定 ?& JSON 运算符

位运算符的问题,&不能进行int,float运算。为啥?

为啥和运算符在 vb.net

LaTex入门教程----常见运算符介绍

为啥不能在函数中使用“=” R 运算符?