Приводит ли этот оператор постинкремента к неопределенному поведению?

При создании программы с использованием более новой версии GCC я обнаружил проблему в коде.

count[i] = count[i]++;

Этот код работал со старой версией GCC (2.95), но не работает с более новой версией (4.8).

Итак, я подозреваю, что это утверждение вызывает неопределенное поведение, я прав? Или есть более подходящий термин для этой проблемы?

Gcc - это компилятор C. Ваш вопрос о C++ или C?

DYZ 26.10.2018 05:07

@DYZ Ну, "GCC" также может быть названием программного пакета, который содержит как компилятор C, так и компилятор C++, а также многое другое ...

user2486888 26.10.2018 05:09

Это вопрос о C++, но если есть какие-либо отличия от C в отношении этой проблемы, я тоже хотел бы знать об этом.

rcr 26.10.2018 05:11
0
3
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Действительно, это неопределенное поведение.

int i = 2;
i = i++; // is i assigned to be 2 or 3?

В соответствии с приоритетом оператора сначала оценивается i++, а затем назначение, поэтому ему будет назначено 3. en.cppreference.com/w/c/language/operator_precedence, хотя это может варьироваться в зависимости от std =

awiebe 26.10.2018 05:16

@awiebe Приоритет оператора - это не то же самое, что порядок оценки. Этот код имеет неопределенное поведение до C++ 17.

Blastfurnace 26.10.2018 05:23

@awiebe Проблема не в том, когда оценивается i++, а в том, когда происходит приращение. Результат будет другим, если приращение происходит после присваивания, и если приращение происходит до присваивания. Приращение отличается от оценки. Этот код записывает и 2, и 3 в i, и ничто не требует, чтобы сначала выполнялась запись (до C++ 17).

David Schwartz 26.10.2018 05:38

@awiebe gcc 4.7.4 возвращает i = 3, а gcc 4.8.1 возвращает i = 2.

Jerry Jeremiah 26.10.2018 06:08
Ответ принят как подходящий

Фактически это определяется как неопределенное поведение, поскольку каждый компилятор определяет свой собственный порядок работы, как указано в: https://en.cppreference.com/w/cpp/language/eval_order

Order of evaluation of the operands of almost all C++ operators (including the order of evaluation of function arguments in a function-call expression and the order of evaluation of the subexpressions within any expression) is unspecified. The compiler can evaluate operands in any order, and may choose another order when the same expression is evaluated again.

На самом деле на странице увеличения / уменьшения в cppreference есть предупреждение: https://en.cppreference.com/w/cpp/language/operator_incdec

Because of the side-effects involved, built-in increment and decrement operators must be used with care to avoid undefined behavior due to violations of sequencing rules.

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