Неопределенное поведение в c/ C++: i++ + ++i vs ++i + i++
Представьте, что у нас есть код ниже:
int i = 1;
int j = i++ + ++i;
Я знаю, что это неопределенное поведение, потому что перед точкой с запятой, которая является точкой последовательности, значение i
был изменен более одного раза. Это означает, что у компилятора может быть две возможности, даже если приоритет оператора плюс находится слева направо:
Случай 1)
- принять значение
i++
--- ценностьi
это 1 - принять значение
++i
--- ценностьi
это 2 - сделайте оператор плюс и присвойте результат 3
j
и сделать побочный эффектi++
(порядок этого шага тоже не определен, но нам все равно, потому что это не изменит результат)
случай 2)
- принять значение
i++
--- ценностьi
это 1 - сделать побочный эффект
i++
--- ценностьi
это 2 - принять значение
++i
--- текущая стоимостьi
это 3 - сделайте оператор плюс и присвойте результат 4
j
Если здесь все в порядке, у меня есть вопрос:
int j = ++i + i++;
Является ли приведенный выше код неопределенным поведением?
На мой взгляд, есть только одна возможность:
- сделать побочный эффект
++i
--- ценностьi
это 2 - принять значение
i++
--- ценностьi
это 2 - сделайте оператор плюс и присвойте результат 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 "может быть неопределенной", но с этим выражением проблем нет.