Why does this code always produce x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
Why does this code always produce x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
Because of short circuit in boolean expression evaluation and because ||
is a sequence point in C and C++.
the 1st x++
changes x to 1 and returns 0
the 2nd x++
changes x to 2 and returns 1
at which point the or short circuits, returns true, and leaves x at 2.
||
short-circuits. Evaluated from left, when a true value is found (non-zero) it stops evaluating, since the expression now is true and never can be false again.
First x++
evaluates to 0 (since it's post-increment), second to 1 which is true, and presto, you're done!
x++ || x++ || x++ || x++ || ........;
trying replacing ||
with |
.--
It is the short circuiting of logical operators.
It's the same reason when you do
if (returns_true() || returns_true()){ }
returns_true
will only get called once.
Because logical OR short-circuits when a true is found.
So the first x++ returns 0 (false) because it is post-increment. (x = 1) The second x++ returns 1 (true) - short-circuits. (x = 2)
Prints x = 2;
Because of early out evaluation of comparisons.
This is the equivalent of
0++ | 1++
The compiler quits comparing as soon as x==1, then it post increments, making x==2
When you're evaluating "a || b || c || d || e || ..." you can stop evaluating at the first non-zero value you find.
The first "x++" evaluates to 0, and increments x to 1, and evaluating the expression continues. The second x++ is evaluated to 1, increments x to 2, and at that point, you need not look at the rest of the OR statement to know that it's going to be true, so you stop.
Because the first "x++ || x++" evaluates to "true" (meaning it is non zero because "0 || 1" is true. Since they are all logical OR operators the rest of the OR operations are ignored.
Mike
The ||
operator evaluates the left-hand expression, and if it is 0 (false), then it will evaluate the right-hand expression. If the left hand side is not 0, then it will not evaluate the right hand side at all.
In the expression x++ || x++ || x++ || ...
, the first x++
is evaluated; it evaluates to 0, and x is incremented to 1. The second x++
is evaluated; it evaluates to 1, and x is incremented to 2. Since the second x++
evaluated to a non-zero value, none of the remaining x++
expressions are evaluated.