Search code examples
cshort-circuiting

Short circuit evaluation with both && || operator


I know what is short circuit evaluation in C.

a && b (operand b is not checked if a = 0)

a || b (operand b is not checked if a = non zero)

But I am stuck at this question

int x = 0;
if (5 || 2 && ++x)
    printf("%d", x);

This outputs 0.

My first thinking goes as follows:

According to precedence table , precedence is ++, &&, || (descending order)

  1. ++x: evaluated.x becomes 1.

  2. 2 && ++x evaluated. Both operands are evaluated.

  3. || is evaluated.

But according to this, 1 should be printed, not 0.

My second thinking goes as this:

5 || anything

anything is not evaluated because of short circuit evaluation, so no precedence comes into play here.


Solution

  • The expression 5 || 2 && ++x is equivalent to 5 || (2 && ++x) due to operator precedence.

    The run time evaluates the expression 5 || 2 && ++x from left to right.

    As we know in OR if first condition is true it will not check the second condition.
    So here 5 evaluated as true and so (2 && ++x) will not be performed.

    That's why x will remain 0 here.