Short circuit evaluation with both && || operator

末鹿安然 提交于 2019-11-26 14:32:18

问题


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.


回答1:


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.




回答2:


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

if(5 || ++x) {
  printf("%d\n",x);
}


来源:https://stackoverflow.com/questions/36879912/short-circuit-evaluation-with-both-operator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!