“(T *)0 - (T *)0”是否明确定义为 0

Is `(T *)0 - (T *)0` well-defined to be 0?

本文关键字:定义 是否      更新时间:2023-10-16

请考虑以下代码:

#include <iostream>
int main()
{
    int *a = 0, *b = 0;
    std::cout << (a - b);
}

在 ideone 上,这段代码按预期打印 0,但我不确定它是否是明确定义的行为。

我想知道(T*)0 - (T*)0是否定义明确?保证等于0吗?
C 和 C++ 中相同吗?如果不是,有什么区别?

(当然,T既不void也不std::nullptr_t,因为指针算术对它们不起作用。

在C++中,请参阅 [expr.add]/7:

如果两个指针 [...] 都是空的,并且两个指针是 减去,结果等于0转换为的值 类型 std::ptrdiff_t .

(这也适用于P0137,它缩短了这一段。

在 C11 中,该行为显然未定义,如 6.5.6/9 所示:

当减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组对象的最后一个元素; 结果是两个数组的下标的差异 元素。