Оценка короткого замыкания оператора с оператором ++ в 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++
не оценивается из-за короткого замыкания выражения из-за &&
оператор, порядок приоритета операторов не имеет значения в данном конкретном случае.