Порядок оценки и неопределенное поведение

Говоря в контексте стандарта C ++ 11 (который, как вы знаете, больше не имеет понятия точек последовательности), я хочу понять, как определяются два простейших примера.

int i = 0;

i = i++;   // #0

i = ++i;   // #1

В SO есть две темы, которые объясняют эти примеры в контексте C ++ 11.Вот было сказано, что#0 вызывает UB и#1 четко определен.Вот было сказано, что оба примера не определены. Эта двусмысленность меня сильно смущает. Я прочитал это хорошо структурированныйссылка уже три раза, но тема кажется мне слишком сложной.

.

Давайте разберем пример#0: i = i++;.

Соответствующие цитаты:

Вычисление значения встроенных операторов postincrement и postdecrement секвенируется перед его побочным эффектом.

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

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

Насколько я понимаю, побочный эффект оператора присваивания не упорядочен с побочными эффектами его левого и правого аргументов. Таким образом, побочный эффект оператора присваивания не связан с побочными эффектамиi++, Так#0 вызывает UB.

.

Давайте разберем пример#1: i = ++i;.

Соответствующие цитаты:

Побочный эффект встроенных операторов preincrement и precrementment секвенируется перед вычислением его значения (неявное правило из-за определения в качестве составного присваивания)

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

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

Я не вижу, чем этот пример отличается от#0, Мне кажется, что это UB по той же причине, что и#0, Побочный эффект назначения не упорядочен с побочным эффектом++i, Кажется, это UB. Тема, которая понравилась выше, говорит, что она четко определена Почему?

.

Вопрос: как я могу применить приведенные правила для определения UB примеров. Было бы очень полезно как можно более простое объяснение. Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос