Очки последовательности и порядок оценки - PullRequest
4 голосов
/ 30 января 2012

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 30 января 2012

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

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

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

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

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

1 Не указана следующая информация:
.....

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

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

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

А также для логического И:

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

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

0 голосов
/ 30 января 2012

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

Предложение относится к объектам, изменяемым выражением, т.е. ia[i]).Таким образом, предыдущее значение i должно использоваться исключительно для определения «нового» значения для i.

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

Справочная информация заключается в том, что в противном случае было бы неясно, если i обозначает значение iдо или после увеличения.

...