C99 §6.5 Выражения
(1) Выражение представляет собой последовательность операторов и операндов, которая задает вычисление значения или обозначает объект или функцию или генерирует побочные эффекты или выполняет их комбинацию.
(2) Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения. 72) Кроме того, предыдущее значение должно быть прочитано только для определить сохраненное значение. 73)
со сносками
72) Флаг состояния с плавающей запятой не является объектом и может быть установлен более одного раза в выражении.
73) Этот параграф отображает выражения выражения undefined, такие как
i = ++i + 1; a[i++] = i;
позволяя
i = i + 1; a[i] = i;
где C11 §6.5 изменен на (текст (1) имеет добавление):
(1) [...] Вычисления значений операндов оператора секвенируются перед вычислением значения результата оператора.
(2) Если побочный эффект скалярного объекта не зависит от другого побочного эффекта для одного и того же скалярного объекта или вычисления значения с использованием значения одного и того же скалярного объекта, поведение undefined. Если существует несколько допустимых порядков подвыражений выражения, поведение undefined, если такой какой-либо побочный эффект происходит в любом из упорядочений. 84)
где сноска 84 в C11 такая же, как 73 на C99.
Я немного смущен... Я читал C11 (2) как "[...] либо (другой побочный эффект для одного и того же скалярного объекта), либо (вычисление значения с использованием значения одного и того же скалярного объекта) [...]", который, кажется, даже не позволяет foo = ++i
(есть побочный эффект, и мы используем значение, зависящее от измененного объекта). Я не носитель языка, однако, было бы неплохо, если бы я мог сказать, как это предложение должно быть "разобрано". Я понимаю C99, но я не совсем понимаю формулировку C11.
В любом случае, фактический вопрос: это изменение от C99 до C11, или эквивалентны эти формулировки? И если да, то почему это было изменено? А если нет, может ли кто-нибудь привести пример выражения, которое является UB в C99, но не на C11 или наоборот?