Reputation:
So, I was writing some code and I was getting an unexpected output in one part of my program which disrupted the entire system.
I managed to extract and simplify the problem to a basic logical expression. Let's say:
int i = 1, j = 1, k = 0;
printf("%d\n", ++i || ++j && k);
printf("%d, %d, %d\n", i, j, k);
return 0;
The output for this program is:
1
2
1
0
I am thinking that the value of j
was not incremented to 2
due to the short circuit nature of the ||
operator. However I am confused how the value of the first "%d"
is 1
. Shouldn't the value of k
be non-zero for the &&
statement to return 1
? Or isn't this statement executed at all since ++i || ++j
is not 0
and thus returns a 1
?
&&
is a logical and, and expr1 && expr2 has the value 1 if values of expr1 && expr2 are both non-zero.Any clarifications would be appreciated and please excuse the basic nature of this question.
Upvotes: 7
Views: 149
Reputation: 60056
&&
has higher precedence than ||
.
(See https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B )
so
++i || ++j && k
is
++i || (++j && k)
and ||
shortcircuits if the first operator is truthy, as per 6.5.14p4 .
If you're on gcc
or clang
and compile your code with -Wall
, the compiler will nudge you to put those parentheses there. It's probably a good idea to heed that advice, as some people get confused by the precedences (I hear).
Upvotes: 7
Reputation: 72177
Operators precedence. &&
has higher precedence than ||
.
Your expression is the same as: ++i || (++j && k)
++i
is TRUE
, the parenthesis is not evaluated anymore.
Upvotes: 1
Reputation: 310910
From the C Standard (6.5.14 Logical OR operator)
3 The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.
This expression
++i || ++j && k
is equivalent to
++i || ( ++j && k )
and according to the quote from the Standard the expression returns integer value 1 because ++i
is not equal to zero. The subexpression ( ++j && k )
is not evaluated.
Upvotes: 3
Reputation: 14853
++i || ++j && k
is evaluate to 1 (true) because i equals 2 (++1), (++j && k) isn't evaluated because short circuit.
Upvotes: 2