Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
456 views
in Technique[技术] by (71.8m points)

c - 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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...