user7468879
user7468879

Reputation:

Logical Expressions in C misunderstanding

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?

Any clarifications would be appreciated and please excuse the basic nature of this question.

Upvotes: 7

Views: 149

Answers (4)

Petr Skocik
Petr Skocik

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

axiac
axiac

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

Vlad from Moscow
Vlad from Moscow

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

Aubin
Aubin

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

Related Questions