Несколько дней назад здесь обсуждалось о том, будет ли выражение
i = ++ я + 1
вызывает UB (Undefined Поведение) или нет.
Наконец, был сделан вывод о том, что он вызывает UB, поскольку значение "i" меняется более одного раза между двумя точками последовательности.
Я участвовал в обсуждении с Йоханнесом Шаубом в той же теме. По его словам,
i = (i, я ++, i) +1 ------ (1)/* также вызывает UB */
Я сказал, что (1) не вызывает UB, потому что побочные эффекты предыдущих подвыражений очищаются оператором запятой ',' между я и я ++ и между я ++ и i.
Затем он дал следующее объяснение:
"Да, точка последовательности после я ++ завершает все побочные эффекты до этого, но нет ничего, что останавливает побочный эффект присваивания с побочным эффектом я ++. Основная проблема заключается в том, что побочный эффект присваивания не указано, что произойдет после или до оценки обоих операндов задания, и поэтому точки последовательности не могут ничего сделать для защиты этого: точки последовательности вызывают частичный порядок: просто потому, что есть точка последовательности после и до того, как я ++ не означает, что все побочные эффекты секвенированы относительно i.
Также обратите внимание, что просто точка последовательности ничего не означает: порядок оценок не продиктован формой кода. Это диктуется семантическими правилами. В этом случае не существует семантического правила, говорящего, когда возникает побочный эффект присваивания в отношении оценки обоих его операндов или подвыражений этих операндов".
Заявление, написанное "смелым", смутило меня. Насколько я знаю:
"В определенных определенных точках последовательности выполнения, называемых точками последовательности, все побочные эффекты предыдущих оценок должны быть полными, и никаких побочных эффектов последующих оценок не должно быть".
Так как, операторы запятой также указывают порядок выполнения, побочный эффект я ++ был отменен, когда мы достигнем последнего i.He(Johannes), было бы правильно, если бы порядок оценки не был указан (но в случае запятой, это хорошо указано).
Итак, я просто хочу знать, вызывает ли (1) UB или нет?. Может ли кто-нибудь дать другое действительное объяснение?
Спасибо!