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

При создании программы с использованием более новой версии 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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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.

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