C 标准是否保证
NULL > NULL
始终为 false?我问是因为 初始或终端 malloc 缓冲区可能吗? 中的对话似乎应该小心指针比较,并且只有在处理指向同一数组元素的指针时才进行比较,松散地说。然而,保证 NULL > NULL
是很方便的,因为我想要一个结构体,它是一个堆栈数组,具有第一个和最后一个元素的字段,如果这个数组仍然有 0
元素,那么很方便将这些字段设置为 NULL
,并且仍然允许 for
循环遍历数组的元素,而不需要明确检查数组是否有 0
元素或更多,所以这样的比较很方便......
令人惊讶的是,它似乎会导致未定义的行为。只有
==
和 !=
可以使用空指针。
比较两个指针时,结果取决于地址空间中的相对位置 所指向的对象。如果两个指向对象类型的指针都指向同一个对象,或者都指向 经过同一数组对象的最后一个元素后,它们比较相等。如果对象指向 是同一个聚合对象的成员,后面声明的结构体成员的指针比较 大于指向结构中先前声明的成员的指针,以及指向数组元素的指针 具有较大下标值的比较大于指向同一数组元素的指针,具有较小的下标值 下标值。指向同一联合对象成员的所有指针比较相等。如果表达式 P 指向数组对象的一个元素,表达式 Q 指向该数组对象的最后一个元素 数组对象时,指针表达式 Q+1 比较大于 P。 在所有其他情况下,行为是 未定义。
(粗体我的)
这与 C++ 不同,C++ 中有一个子句明确表示
<
,<=
,>
,>=
与 ==
,!=
: 一致
[expr#rel]/5
如果两个操作数
和p
比较相等 ([expr.eq]),则q
和p<=q
都产生p>=q
,并且true
和p<q
都产生p>q
。 ...false