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