"&a + 1>&a"会导致未定义的行为

exp*_*sic 17 c c++ c99 c++03

c99/c++03保证&a+1 > &a永远是真的吗?

例如,有一个(类似c)std::copy,和

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
Run Code Online (Sandbox Code Playgroud)

这总是有效吗?

Jer*_*fin 17

是的,C99有一个特殊的措辞,说当使用地址时,任何给定的对象a将像一个1项的数组,所以这&a+1是有效的(§6.5.6/ 7):

出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型.

虽然部分编号不同(§6.3.6),但C90给出了相同的要求.

C++在§5.7/ 4中有相同的要求(C++ 03和C++ 11中的段号相同).

在C++中,您可以比较使用任意对象(相同类型)的地址std::less,即使内置<运算符不会产生有意义的结果(例如,两个不属于同一数组的对象)(§20.8.5/ 7) ):

为模板greater,less,greater_equal,和less_equal,对于任何指针类型的特化得到总共顺序,即使内置的操作符<,>,<=,> =没有.

另外请注意,虽然可以形成这些地址,可以比较它们对象的地址,你可以不取消引用这些指针(当然,编译器可能不会阻止你,如果你尝试,但结果将是不确定的行为).