Как определить, если два побочных эффекта на задании не являются последовательными?

От §5.2.6 / 1 у нас (акцент мой):

Значение выражения postfix ++ — это значение его операнда. [
Примечание: полученное значение является копией исходного значения — примечание конца] Операндом должно быть изменяемое значение l. Тип операнда
должен быть арифметическим типом, отличным от cv bool, или указателем на
полный тип объекта. Значение объекта операнда изменяется
добавив 1 к нему. Вычисление значения выражения ++
последовательность перед модификацией объекта операнда
. С
уважение к неопределенно-последовательному вызову функции, операция
Postfix ++ является единственной оценкой. [Примечание: следовательно, функция
вызов не должен вмешиваться между преобразованием lvalue в rvalue и
побочный эффект, связанный с любым отдельным оператором postfix ++. — конец
примечание] Результат является prvalue. Тип результата:
cv-неквалифицированная версия типа операнда. Если операнд
битовое поле, которое не может представлять увеличенное значение, результирующее
Значение битового поля определяется реализацией. Смотрите также [expr.add] и [expr.ass].

То есть модификация объекта операнда после вычисление значения ++ выражение.

От §5.18 / 1 у нас (акцент мой):

Оператор присваивания (=) и все составные операторы присваивания
группа справа налево. Все требуют изменяемого lvalue как их левый
операнд и возвращает значение l, ссылаясь на левый операнд. Результат
во всех случаях это битовое поле, если левый операнд является битовым полем. В целом
случаи, присваивание выполняется после вычисления значения
правый и левый операнды
, и до вычисления значения
выражение присваивания. По отношению к неопределенно последовательным
вызов функции, операция составного присваивания является одной
оценка. [Примечание: следовательно, вызов функции не должен вмешиваться
между преобразованием lvalue в rvalue и побочным эффектом, связанным
с любым составным оператором присваивания. — конец примечания]

Назначение выражение:
      условно-выражение
      логико-или-выражение Назначение-оператор инициализатор-раздел
      вбрасывание выражение

Назначение-оператор: один из
      = * = / =% = + = — = >> = <<знак равно &= ^ = | =

Назначение также после вычисление значения правого и левого операндов оператора присваивания.

Таким образом, если мы рассмотрим выражение

i = i++;

мы знаем из §5.2.6 / 1, что побочный эффект выражения i++на RHS этого выражения присваивания последовательности после вычисления значения i++, А из §5.18 / 1 мы знаем, что побочный эффект, соответствующий присвоению i На LHS оператор присваивания секвенируется после вычисления значения правого и левого операндов оператора присваивания.

Но как мне показать, что эти два побочных эффекта не последовательны, чтобы доказать, что выражение i = i++; показывает неопределенное поведение?

3

Решение

Во-первых, если A не секвенируется до B, а B не секвенируется до A, тогда A и B unsequenced (1,9 / 13). Это определение непоследовательных. Во-вторых, если два побочных эффекта на скалярный объект не секвенированы, поведение не определено (1.9 / 15). Поэтому, если вы не можете найти что-то, что говорит о том, что постинкремент и присваивание являются последовательными (и вы не будете), поведение не определено.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]