Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 278
user3126632 Avatar asked Jan 07 '23 04:01

user3126632


2 Answers

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.

like image 85
Himanshu Avatar answered Jan 11 '23 07:01

Himanshu


Correct. The expression is short circuited. You can test it with this.

if(5 || ++x) {
  printf("%d\n",x);
}
like image 38
Harry Avatar answered Jan 11 '23 09:01

Harry