Является ли «a + = a» неопределенным поведением, таким как «i = i ++»? - PullRequest
1 голос
/ 15 апреля 2019

Я понимаю, что i = i ++ - неопределенное поведение в C. Но у меня есть сомнения по поводу + = а. Это тоже неопределенное поведение?

1 Ответ

2 голосов
/ 15 апреля 2019

Нет, 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, но они упорядочены.
...