Переменная c
не увеличивается, поскольку RHS (правая сторона) ||
не выполняется, если LHS не оценивается как false, а LHS оценивается как true.Операторы C ||
и &&
являются операторами «короткого замыкания»;они не оценивают второй операнд, если только первый не является достаточным для определения общей истинности выражения.
&&
связывается сильнее, чем ||
, поэтому операцию можно заключить в скобки как:
d = (++a && ++b) || ++c;
Значение ++a
равно -2, что соответствует значению true (, поскольку любое значение, отличное от 0, равно true );значение ++b
равно 3, что соответствует истине;поэтому значение &&
является истинным.Поскольку true || false
и true || true
оба оценивают как true
, нет необходимости оценивать RHS, чтобы знать общий результат.(Аналогичное правило для &&
состоит в том, что если первый член оценивается как ложный, нет необходимости оценивать второй, потому что общее выражение должно быть ложным. Если у вас было a = -1;
до теста, то b
не будетбудет увеличено, потому что ++a
будет равно нулю или ложно, поэтому RHS &&
не оценен. Конечно, тогда c
будет увеличен, потому что LHS ||
будет ложным, а RHS будетдолжны быть оценены, чтобы определить общий результат.)