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,因为指针算法对它们不起作用.)
在C++中,请参阅[expr.add]/7:
如果两个指针都为空,并且减去了两个指针,则结果比较等于
0转换为该类型的值std::ptrdiff_t.
(这也适用于P0137,缩短了这一段.)
在C11中,根据6.5.6/9,行为显然是未定义的:
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素 ; 结果是两个数组元素的下标的差异.