Нет, a += a
не является неопределенным.Поведение i = i++
не определено стандартом C из-за этого правила в C 2018 6.5 2:
Если побочный эффект на скалярном объекте не секвенирован относительно другого побочного эффекта наодин и тот же скалярный объект или вычисление значения с использованием значения одного и того же скалярного объекта, поведение не определено.
Это правило применяется, потому что как i++
, так и i =
имеют побочные эффекты обновления i
и они не упорядочены.(Хотя вычисление значения i++
, которое производит значение для использования в остальной части выражения, секвенируется перед присваиванием, его побочный эффект обновления i
не упорядочен относительно назначения.)
В a += a
вычисление значения правого операнда (a
) происходит до назначения (согласно 6.5.16 3), а затем a +=
имеетпобочный эффект обновления a
.Итак:
- Существует только один побочный эффект, поэтому нет двух непоследовательных побочных эффектов.
- Существует побочный эффект для
a
и вычисление значения a
, но они упорядочены.