Дискуссия возникла вокруг оператора C x = b[i] + i++;
и его определенности.
Аргумент в пользу того, что указанное утверждение не определено, выглядит примерно так:
§ 6.5 состояний C99:
[…] порядок вычисления подвыражений и порядок возникновения побочных эффектов не определены.
Таким образом, не гарантируется, что i
увеличивается послеон используется в операторе индекса в качестве индекса массива.
Однако я по-разному интерпретирую указанную спецификацию.
§ 6.5 C99 дополнительно заявляет:
Междув предыдущей и следующей точке последовательности объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения.Кроме того, предыдущее значение должно быть только для чтения, чтобы определить значение, которое должно быть сохранено.
§ 5.1.2.3 C99-состояний:
В определенных заданных точках выполненияпоследовательность, называемая точками последовательности, все побочные эффекты предыдущих оценок должны быть полными, и не должно иметь место никаких побочных эффектов последующих оценок.
Список точек последовательности приведен в приложении C, и только следующие совпадениярассматриваемое утверждение ИМХО.
Конец полного выражения
Оценка b[i]
(значение элемента i
из b
) изначение i++
(просто i
) может произойти в любом порядке до добавления (и оценки =
, которая является значением RHS).Однако побочные эффекты всего оператора откладываются до окончания всех этих оценок, поскольку это единственная точка последовательности.В этом случае побочными эффектами являются изменение x
и увеличение i
.
Кто прав?Есть ли дополнительные параграфы, имеющие отношение к аргументу?Чем отличается в C ++?