Does relational operator affect assignment operator operations?
c
Solution
Yes, the concept is called Short-Circuit (in logical `&&`, `||` operators expression).
In the case of any logical expression (includes `||`, `&&`) compiler stop evaluation expression as soon as result evaluated (and save executions).
The technique for short-circuit is:
`!0 || any_expression` == `1`, so `any_expression` not need to evaluate.
And because in your expression `i` is not zero but its 10, so you can think if consdition `(i || (j = i + 10))` just as `i`.
Logical OR operator: The `||` operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares `unequal` to `0`, the second operand is `not` evaluated.
Similarly for && (and operator): `0 && any_expression` == `0`, so `any_expression` not need to evaluate.
In your expression:
(i || (j = i + 10) )
------------
^
| Could evaluate if i is 0,
as i = 10 (!0 = true), so j remains unchanged as second operand is not evaluated
For or `||` operator answer can be either 0, 1. To save execution, evaluation stops as soon as results find. So if first operand is non-zero result will be `1` (as above) for the expression. So for first operand `i = 10` compares unequal to 0, the second operand `(j = i + 10)` is not evaluated so `j` remains `0` hence output of your code is `0`.
Note: Short-circuit behavior is not only in present in C but concept is common to many languages like Java, C++, Python. (but not all e.g. VB6).
In C short-circuiting of logical expressions is guaranteed has always been a feature of C. It was true when Dennis Ritchie designed and implemented the first version of C, still true in the 1989 C standard, and remains true in the C99 standard.
A related post: Is short-circuiting boolean operators mandated in C/C++? And evaluation order?
Problem
Why the output of below mentioned program is `0` not `20` ? ``` #include <stdio.h> int main() { int i = 10, j = 0; if (i || (j = i + 10)) /* do something */; printf("%d\n",j); } ```