为啥在检查符号是不是存在时不能使用否定运算符?
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 进行比较。
这部分只说 - 如果你想检查存在(而不是不存在),你必须明确比较NULL
或NIL
您不能使用否定运算符 (!) 来否定 符号。
如果你成功否定了符号的地址,它只是你成功地检查了不存在(而不是存在)。
当我遇到以下情况时,我认为这可能是一种可能性,因为他们使用了可用性这个词here -
注意:要检查函数的可用性,请显式比较其 地址为 NULL 或 nil。您不能使用否定运算符 ( ! ) 否定函数的地址以检查其可用性。另外,请注意 C 函数的名称与其地址是同义词。那是, &myFunction 等价于 myFunction。
【讨论】:
以上是关于为啥在检查符号是不是存在时不能使用否定运算符?的主要内容,如果未能解决你的问题,请参考以下文章