17

是否c99/c++03保证&a+1 > &a始终正确?

例如,有一个 (c-like) std::copy,并且

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;

这总是有效吗?

4

2 回答 2

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_equalless_equal

另请注意,虽然您可以形成这些地址,并且可以将它们与对象的地址进行比较,但您不能取消引用这些指针(好吧,如果您尝试编译器可能不会阻止您,但结果将是未定义的行为)。

于 2013-04-30T13:42:00.687 回答
3

是的,这在 C++ 中得到保证(不了解 C)。具体来说,T 类型的变量等价于同一类型的单个元素的数组,并且始终可以获得超出数组末尾的指针。

于 2013-04-30T13:31:50.120 回答