Очки последовательности и порядок оценки

Я читал K&R и наткнулся на этот пример о неопределенности в поведении, оценивая выражение как a[i]=i++; Спецификация C99 в $6.5.2 говорит, что

Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения. Кроме того, предыдущее значение должно быть только для чтения, чтобы определить значение, которое будет сохранено.

Приведенный выше пример из K&R подходит для первого утверждения. Пожалуйста, объясните, как это терпит неудачу на втором.

Стандарт говорит что-нибудь о порядке вычисления подвыражений в случае задействования точек последовательности. Например. a[i++] || b[i++], Я знаю, что они оцениваются слева направо, но как это можно получить из приведенного выше утверждения или это где-то явно указано в стандарте?

2 ответа

Решение

Стандарт говорит что-нибудь о порядке вычисления подвыражений в случае точек последовательности?

Порядок оценки хорошо определен в случае условных операторов && так же как || и это является причиной короткого замыкания.

Это явно указано в стандарте c99.

Ссылка: Стандарт c99

Приложение J: J.1 Неуказанное поведение

1 Следующее не указано:
.....

Порядок, в котором оцениваются подвыражения, и порядок, в котором имеют место побочные эффекты, за исключением случаев, указанных для операторов function-call (), &&, ||,?: И запятых (6.5).
.....

Далее,
6.5.14 Логический оператор ИЛИ

4) В отличие от побитового | оператор, || оператор гарантирует оценку слева направо; после оценки первого операнда есть точка последовательности. Если первый операнд сравнивается не равным 0, второй операнд не оценивается.

Как и для логического И:

6.5.13 Логический оператор И

В отличие от побитового двоичного оператора &, оператор && гарантирует оценку слева направо; если вычисляется второй операнд, между оценками первого и второго операндов существует точка последовательности. Если первый операнд сравнивается равным 0, второй операнд не оценивается.

Для первой части вопроса:

Предложение относится к объектам, изменяемым выражением, т.е. i (а также a[i]). Итак, предшествующее значение i должен использоваться исключительно для определения "нового" значения для i,

Но выражение "использует" его также для определения элемента массива, в который нужно записать.

Фоном является то, что в противном случае было бы неясно, если i обозначает iЗначение до или после увеличения.

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