void
的指针”。然后第5段说:“…如果一个操作数是对象类型的指针,另一个操作数是指向限定或非限定版本的void的指针,则前者转换为后者的类型。”ptr
不是空指针),(void *) ptr
也不是空指针,我们也不希望这种情况被包含在“一个数组的末尾和另一个数组的开头”的情况中。因此,我们期望当“(void *)ptr ==(void *)ptr”评估为真时,它必须处于“指向同一对象”或“指向同一数组对象的最后一个元素”的情况下。那似乎是唯一合理的解释标准的方式。如果是这样的话,则该情况(无论哪种情况适用于某些情况)必须始终适用,并且“当且仅当”告诉我们,“(void *)ptr ==(void *)ptr”始终为真。ptr
是指向对象类型的指针,则(void *) ptr == ptr
等同于(void *) ptr == (void *) ptr
。右侧的ptr
会被隐式转换为void *
。(如果它是指向const
或volatile
限定类型的指针,则这些限定符在隐式转换中丢失。)ptr
是一个宏,扩展为具有副作用的表达式,在不同的评估中更改其值,或者是一个不确定值的表达式,使用它是未定义行为,否则(void *) ptr
肯定等于自己。ptr
是指向函数的指针,则(void *) ptr == ptr
需要进行诊断;但很明显讨论是关于对象类型的。
(void*) ptr == ptr
和(void*) ptr == (void*) ptr
是一样的,因为第二个操作数将被隐式转换为void*
以进行比较。不过我不是100%确定... - Nikos C.ptr
是一个函数指针,在这种情况下,标准不能保证它。 - Tom Karzes