如果我说,
int a[] = {1, 2, 3, 4, 5};
int *p = a;
现在,如果我写p + 1 + 2
,它是否与((p + 1) + 2)
相同?任何证明这个错误的标准参考?
答案 0 :(得分:4)
只有当你没有超出范围时。例如,在此:
int a[] = {1, 2, 3, 4, 5};
int *p = (a + 10) - 9;
int *q = a + (10 - 9);
p
的赋值会调用未定义的行为,而q
的赋值则不会。
但是,只要你保持在范围内,你就会期待关联性。
顺便提一下,请注意,在你的问题中,你给出的两件事情的定义是相同的,因为加法(好吧,范围内的加法)是左联想的。也就是说,x + y + z == (x + y) + z
,而不是x + (y + z)
。
答案 1 :(得分:3)
§3.7.4.3
2
A pointer value is a safely-derived pointer to a dynamic object only if it has pointer-to-object type and it is one of the following: ... the result of well-defined pointer arithmetic (5.7) using a safely-derived pointer value;
§5.7
3
The result of the binary + operator is the sum of the operands.
听起来很合法。
答案 2 :(得分:2)
指针和整数之间的加法在C ++ 11中定义如下(5.7 / 5):
如果表达式P指向数组对象的第i个元素,则为 表达式(P)+ N(等效地,N +(P))和(P)-N(其中N具有 值n)分别指向第i + n和第i-n个元素 数组对象,只要它们存在。
下一句话讨论了一个超过数组末尾的指针。
因此,涉及指针的添加与""相同;涉及索引的加法,当然是关联的。从这里你可以推断出,如果数组元素存在(或者是一个结束),那么涉及指针的添加是关联的。
如果算术超出了指针所指向的数组范围,则行为未定义,因此特别不需要是关联的。
答案 3 :(得分:1)
我在实践中相信是的,但理论上可能没有。
你问p + 3
是否与((p + 1) + 2)
相同,但是标准说指针算法只在数组中有意义,或者只是在结束时只有一个元素。
答案 4 :(得分:1)
指针实际上只是数字,所以添加将以您描述的方式关联。
编辑:请参阅下面的评论来自delnan - 虽然是,添加将是关联的,我的说法指针只是数字不太正确。