Приоритет логических операторов в C

Возможный дубликат:
почему “++ 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 интерпретируется как

    1. Оценить ++ a
    2. Если результат 1 равен нулю, оцените ++ 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) .