`(T*)0 - (T*)0`是否定义为0?

Hol*_*Cat 2 c c++ pointers language-lawyer

考虑以下代码:

#include <iostream>

int main()
{
    int *a = 0, *b = 0;
    std::cout << (a - b);
}
Run Code Online (Sandbox Code Playgroud)

ideone中,此代码按预期打印0,但我不确定它是否是明确定义的行为.

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

(当然,T不是void也不是std::nullptr_t,因为指针算法对它们不起作用.)

Col*_*mbo 6

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

如果两个指针都为空,并且减去了两个指针,则结果比较等于0转换为该类型的值std::ptrdiff_t.

(这也适用于P0137,缩短了这一段.)

在C11中,根据6.5.6/9,行为显然是未定义的:

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