Является ли арифметика по указателям ассоциативной? - PullRequest
7 голосов
/ 06 декабря 2011

Если я скажу,

int a[] = {1, 2, 3, 4, 5};
int *p = a;

Теперь, если я напишу p + 1 + 2, будет ли оно таким же, как ((p + 1) + 2)?Любая стандартная ссылка, которая доказывает это неправильно?

Ответы [ 5 ]

4 голосов
/ 06 декабря 2011

Только если вы не выходите за пределы диапазона.Например, в этом:

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).

3 голосов
/ 06 декабря 2011

§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 голосов
/ 06 декабря 2011

Сложение между указателем и целым числом определяется в C ++ 11 следующим образом (5.7 / 5):

, если выражение P указывает на i-й элемент объекта массива,выражения (P) + N (эквивалентно, N + (P)) и (P) -N (где N имеет значение n) указывают соответственно на i + n-й и i-n-й элементы массиваобъект, при условии, что они существуют.

В следующем предложении говорится об указателях, следующих за концом массивов.

Таким образом, добавление с использованием указателей - это то же самое, что и добавление с использованием индексовчто, конечно, является ассоциативным.Из этого вы можете сделать вывод, что, если элементы массива существуют (или находятся за концом), то добавление, включающее указатели, является ассоциативным.

Если ваша арифметика превышает границы массива, на который указывает указатель, топоведение не определено, и, следовательно, в частности, не обязательно должно быть ассоциативным.

1 голос
/ 06 декабря 2011

Указатели на самом деле являются просто числами, так что да, сложение будет ассоциативным в том смысле, как вы описываете.

РЕДАКТИРОВАТЬ: см. Комментарий ниже от delnan - хотя да, добавление будет ассоциативным, мое утверждение, что указатели являются просто числами, не совсем корректно.

1 голос
/ 06 декабря 2011

Я полагаю, что да на практике, но, возможно, нет в теории.

Вы спрашиваете, совпадает ли p + 3 с ((p + 1) + 2), но стандарт говорит, что арифметика указателей имеет смысл только внутри массива или только одного элемента после его конца.

...