Оценка короткого замыкания оператора с оператором ++ в C

Я выполнил следующий код в Code::Blocks 10.05 в Windows 7.

int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);

Вывод, который я получил, приведен ниже,

a=1
b=0
c=0

Это имеет смысл из-за оценки короткого замыкания.

Выражение a++ это пост приращение и 0 возвращается к логическому и (&&). Отсюда и часть b++ не оценивается, так как оба 0 && 0 а также 0 && 1 оценивает 0,

Но тут возникает мое сомнение. Значение приоритета операторов четко гласит, что ++ имеет более высокий приоритет над &&, Так что мое понимание было таким, оба a++ и b++ оцениваются, а затем && проверяет только результат выражения a++ прийти к решению. Но этого не произошло только a++ оценивается здесь.

В чем причина такого поведения? Есть ли && Быть точкой последовательности как-то связано с этим поведением? Если так, почему мы говорим, что && имеет более низкий приоритет, чем ++?

2 ответа

Решение

Вы не уверены в приоритете и порядке оценки.

Приоритет определяет, как сгруппированы операторы, т.е.

c = a++ && b++;

эквивалентно:

c = ((a++) && (b++));

Порядок оценки определяет, как оценивается выражение, короткое замыкание && средства a++ оценивается первым, если он равен нулю, конец; если это не ноль, b++ Затем оценивается.


В качестве другого примера:

c = (a++) + (b++);

Является a++ оценивали раньше b++? Ответ - мы не знаем. Большинство операторов не определяют порядок оценки. && является одним из немногих операторов, которые определяют. (Остальные ||, , а также ?:)

Здесь есть два понятия - порядок приоритета и порядок оценки. Порядок приоритета будет иметь влияние, только если выражение (или подвыражение) оценивается.

В общем, порядок оценки не упорядочен. Для данного оператора его операнды могут оцениваться в любом порядке. Аргументы функции могут быть оценены в любом порядке.

Из стандарта C++:

1.9 Выполнение программы

15 Если не указано иное, вычисления операндов отдельных операторов и подвыражений отдельных выражений не являются последовательными.

а также

8.3.6 Аргументы по умолчанию

9 Аргументы по умолчанию оцениваются каждый раз, когда вызывается функция. Порядок вычисления аргументов функции не указан.

Для логического оператора И &&стандарт C++11 гласит:

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

1 && оператор группы слева направо. Оба операнда контекстно преобразуются в тип bool (Пункт 4). Результат true если оба операнда true а также false иначе. В отличие от &, && гарантирует вычисление слева направо: второй операнд не оценивается, если первый операнд false,

Аналогичное исключение указано для логического оператора ИЛИ, ||,

поскольку b++ не оценивается из-за короткого замыкания выражения из-за && оператор, порядок приоритета операторов не имеет значения в данном конкретном случае.

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