0

Это определенное поведение?Оператор C + = Последовательность?

*p += *p--; 

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

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

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

+0

Да, это действительно так. –

+0

Возможный дубликат [Неопределенное поведение и точки последовательности] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) – BlackDwarf

+0

Я не видел вопроса, когда я разместил его, но ответ Лундина определенно более разъясняет мне, что ответы на упомянутый вами вопрос. –

ответ

3

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

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

6.5 заявляет, что это УБ:

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