int a = 0, b= 1, c = 1;
if (c-- || ++a && b--)
I know that the precedence for && is the highest here. So what happens? Does it start from && and then looks at the expression on its left which is (c-- || ++a) and evaluates that first?
I have been experimenting for a while with different expressions and I just can't wrap my head around it. Thanks in advance.
Edit: I would have used parenthesis if I could but this is a uni question so I don't really have a say
Operator precedence does not totally determine evaluation order. What it does do is dictate how operands are grouped. And since &&
has higher precedence than ||
as you noted, your expression is equivalent to:
(c-- || (++a && b--))
Given that the &&
operator uses short circuit evaluation, ++a
would be evaluated before ++b
. However, the entire subexpression ++a && b--
is the right side of the ||
operator which also uses short circuit evaluation, which means the left side, i.e. c--
would get evaluated first.
Since c--
evaluates to 1, the right side of the ||
operator, i.e. ++a && b--
, is not evaluated. So c
gets decremented and a
and b
are left unchanged.