Неопределенное поведение в c/ C++: i++ + ++i vs ++i + i++

Представьте, что у нас есть код ниже:

int i = 1;
int j = i++ + ++i;

Я знаю, что это неопределенное поведение, потому что перед точкой с запятой, которая является точкой последовательности, значение i был изменен более одного раза. Это означает, что у компилятора может быть две возможности, даже если приоритет оператора плюс находится слева направо:

Случай 1)

  1. принять значение i++ --- ценность i это 1
  2. принять значение ++i --- ценность i это 2
  3. сделайте оператор плюс и присвойте результат 3 j и сделать побочный эффект i++ (порядок этого шага тоже не определен, но нам все равно, потому что это не изменит результат)

случай 2)

  1. принять значение i++ --- ценность i это 1
  2. сделать побочный эффект i++ --- ценность i это 2
  3. принять значение ++i --- текущая стоимость i это 3
  4. сделайте оператор плюс и присвойте результат 4 j

Если здесь все в порядке, у меня есть вопрос:

int j = ++i + i++;

Является ли приведенный выше код неопределенным поведением?

На мой взгляд, есть только одна возможность:

  1. сделать побочный эффект ++i --- ценность i это 2
  2. принять значение i++ --- ценность i это 2
  3. сделайте оператор плюс и присвойте результат 4 j и сделать побочный эффект i++ (порядок этого шага тоже не определен, но нам все равно, потому что это не изменит результат)

Я прав?

Кстати, я прочитал эту ссылку:
Неопределенные точки поведения и последовательности

3 ответа

Решение
int j = ++i + i++;

все еще неопределенное поведение, так как ++i а также i++ может обрабатываться одновременно в нескольких конвейерах в некоторых процессорах, что приведет к непредсказуемым результатам.

Нет, вы не правы. Каждое из выражений ++i а также i++ модифицировать iтаким образом, заявление изменяет i больше чем единожды. Это неопределенное поведение.

Обратите внимание, что более поздние версии стандартов больше не включают понятие "точка последовательности".

int i = 1;
int j = i++ + ++i;

Оценка будет происходить справа налево, т.е. во-первых ++i будет обработан тогда i++, Так j будет иметь значение 4.

Вы получите предупреждение о том, что "операция над" i "может быть неопределенной", но с этим выражением проблем нет.

Другие вопросы по тегам