Возможный дубликат:
почему “++ x || ++ y && ++ z “сначала вычислить” ++ x “? однако оператор «&&» выше, чем «||»
Если вы посмотрите на таблицу приоритетов C, вы увидите, что && имеет более высокий приоритет, чем ||.
Но посмотрите на следующий код:
a=b=c=1; ++a || ++b && ++c; printf("%d %d %d\n",a,b,c);
Он печатает «2 1 1», что означает, что сначала оценивается «++ a», и как только программа увидит TRUE там, он останавливается прямо там, потому что то, что находится на другой стороне || не имеет значения.
Но поскольку && имеет более высокий приоритет, чем ||, не следует сначала оценивать «++ b && ++ c», а затем результат возвращается обратно в «++ a || result»? (в этом случае программа будет печатать «1 2 2»).
Просто попробуйте представить это с помощью круглых скобок:
++a || ++b && ++c;
равняется
(++a) || (++b && ++c);
который оценивается слева направо.
если && и || будет иметь тот же приоритет, он будет выглядеть
(++a || ++b) && (++c);
Правила приоритета говорят только, что они будут оцениваться следующим образом:
++a || (++b && ++c);
Теперь идет короткое замыкание поведения логических операторов, в котором говорится, что вы должны оценивать термины слева направо и останавливаться, когда результат известен. Часть справа никогда не будет выполнена.
Приоритет и порядок оценки – это две совершенно разные вещи. Для логических выражений оператора оценка всегда слева направо. Выражение ++a || ++b && ++c
++a || ++b && ++c
интерпретируется как
Выражение анализируется как ++a || (++b && ++c)
++a || (++b && ++c)
; все выражение истинно, если истинно любое из подвыражений ++a
или ++b && ++c
.
&& has higher precedence
только в дереве parsingа. Но компилятор оптимизирует код как
if( !++a ) { ++b && ++c; }
Ваш пример ++a || ++b && ++c
++a || ++b && ++c
– это то же самое, что ++a || (++b && ++c)
++a || (++b && ++c)
.