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); } ```

Original source

Related problems