При создании программы с использованием более новой версии GCC я обнаружил проблему в коде.
count[i] = count[i]++;
Этот код работал со старой версией GCC (2.95), но не работает с более новой версией (4.8).
Итак, я подозреваю, что это утверждение вызывает неопределенное поведение, я прав? Или есть более подходящий термин для этой проблемы?
@DYZ Ну, "GCC" также может быть названием программного пакета, который содержит как компилятор C, так и компилятор C++, а также многое другое ...
Это вопрос о C++, но если есть какие-либо отличия от C в отношении этой проблемы, я тоже хотел бы знать об этом.





Действительно, это неопределенное поведение.
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 Приоритет оператора - это не то же самое, что порядок оценки. Этот код имеет неопределенное поведение до C++ 17.
@awiebe Проблема не в том, когда оценивается i++, а в том, когда происходит приращение. Результат будет другим, если приращение происходит после присваивания, и если приращение происходит до присваивания. Приращение отличается от оценки. Этот код записывает и 2, и 3 в i, и ничто не требует, чтобы сначала выполнялась запись (до C++ 17).
@awiebe gcc 4.7.4 возвращает i = 3, а gcc 4.8.1 возвращает i = 2.
Фактически это определяется как неопределенное поведение, поскольку каждый компилятор определяет свой собственный порядок работы, как указано в: 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.
Gcc - это компилятор C. Ваш вопрос о C++ или C?