Оператор C += Точка последовательности?

Это определенное поведение?

*p += *p--;

И если да, то эквивалентен ли он { p[0] += p[0]; --p; } или { p[-1] = p[0]; --p; }?

Я предполагаю, что быть определенным или нет, зависит от того, имеет ли += неявную точку последовательности, и, если она есть, я предполагаю, что второй блок должен быть правильным.

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


person Toni Homedes i Saun    schedule 26.05.2015    source источник
comment
возможный дубликат неопределенного поведения и точек последовательности   -  person BlackDwarf    schedule 26.05.2015
comment
Я не видел вопроса, когда публиковал его, но ответ Лундина определенно более прояснил меня, чем ответы на вопрос, который вы упомянули.   -  person Toni Homedes i Saun    schedule 26.05.2015


Ответы (1)


Это неопределенное поведение, поскольку оценка *p не связана с оценкой *p--. Нет точки последовательности. Для всех операторов присваивания 6.5.16:

Побочный эффект обновления сохраненного значения левого операнда упорядочивается после вычисления значений левого и правого операндов. Оценки операндов не упорядочены.

6.5 указано, что это УБ:

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

person Lundin    schedule 26.05.2015