Это результат short-circuit evaluation.
++x
Выражение вычисляется в 2
, и компилятор знает, что 2 || anything
всегда имеет значение 1
(«истина»), независимо от того, что anything
есть. Поэтому он не переходит к оценке anything
, а значения y
и z
не меняются.
Если вы попытаетесь с
x=-1;
y=z=1;
Вы увидите, что y
и z
будет увеличиваться, потому что компилятор должен оценить правую сторону или, чтобы определить результат выражения.
Редактировать: asaerl ответил на ваш последующий вопрос в комментариях сначала, поэтому я просто немного расправлю его правильный ответ.
Приоритет оператора определяет, как части, составляющие выражение, связываются вместе. Потому и имеет более высокий приоритет, чем OR, компилятор знает, что ты написал
++x || (++y && ++z)
вместо
(++x || ++y) && ++z
Это оставляет поручено сделать или между ++x
и ++y && ++z
. На этом этапе, как правило, можно будет выбрать, будет ли он «предпочитать» сначала оценить одно или другое выражение - в соответствии со стандартом - и вы обычно не сможете зависеть от конкретного порядка. Этот порядок не имеет ничего общего с приоритетом оператора.
Однако специально для ||
и &&
Стандартной требует оценки будет всегда перейти слева направо, так что короткое замыкание может работать и разработчики могут зависеть от выражения RHS не вычисляется, если результат вычисления говорит lhs.
Спасибо, что помогли, но не порядок приоритетности вступает в игру здесь? Значение ++ y && ++ z должно быть оценено сначала, прежде чем || ? – krishnang
№ приоритета - порядок в разборе, а не порядок оценки. BTW, если '++ z' был оценен, это был UB. (изменение 'z' дважды) – asaelr