Почему это неопределенное поведение? - PullRequest
5 голосов
/ 05 ноября 2010

Почему следующее данное выражение вызывает неопределенное поведение?

int i = 5;
i = (i,i++,i) + 1 

На мой вопрос влияет вопрос Алса здесь

Ответы [ 3 ]

11 голосов
/ 05 ноября 2010

Не определено.

Ответ здесь за C, Очки последовательности и частичный порядок

Я думаю, что то же самое относится к C ++ (и вот мой ответ, прежде чем я увидел эту ссылку):

Оператор запятой вводит точку последовательности (и в некоторой степени ограничивает порядок, в котором должно быть вычислено выражение - слева направо), поэтому:

  • две модификации i разделены точкой последовательности (вторая запятая).
  • модификация i в i++ отделена от всего остального точками последовательности.
  • модификация i на = не отделена от последнего вхождения i в выражении, но это нормально, потому что нам разрешен доступ к i и его изменение без промежуточной точки последовательности, при условии, что доступ «определяет значение, которое будет сохранено» (5/4).
  • Как говорит Алс, на практике не имеет значения, определил ли этот код поведение или нет при условии, что у всех есть здравый смысл не писать его; -)
0 голосов
/ 05 ноября 2010

Не определено в C ++, чтобы присвоить себе увеличенное значение:

i = i++

Что должно быть i после этого? Должно ли это быть предыдущее значение или один плюс предыдущее значение? Порядок выполнения остается за компилятором, поэтому разные платформы будут иметь разные результаты.

0 голосов
/ 05 ноября 2010

Поскольку в стандарте не определено, какой из постинкрементов или присвоений будет выполняться первым; это зависит от реализации компилятора, чтобы решить их порядок.

...