Why does this code always produce x=2?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
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.
x would always appear to be 0.|| acts as a sequence point. (6.5.14/4 in the C99 standard.)&&, ||, ?:, or the comma operator, and after the evaluation of the arguments and function expression in a function call.x++ || x++ || x++ || x++ || ........;
Because of short circuit in boolean expression evaluation and because || is a sequence point in C and C++.
|| operator introduces a sequence point, so the expression is not undefined.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.
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.
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.
|| is a sequence point and | isn't, if you replace || with |, you'll be invoking undefined behavior, and that won't really tell you anything.
||is a sequence point between the left and right sides.