+ 17

# Explain C++ code

There is a C++ challenge with the following code: int x=1,y=1,z=1; cout << (++x || ++y && ++z); cout << x << y << z; Thre result is 1211. First '1' is from the first cout and therefore: x = 2 y = 1 z = 1 I know that for an OR expression such as (++x || ++y), if the first term is true then there is no need to evaluate the second. This leads to x=2 and y=1. But how about the AND expression? Why is z not set to 1? Does z not getting evaluated?

15 Answers

+ 12

z is not getting evaluated because it looks like this:
++x || (++y && ++z)
since && has higher precedence than ||

+ 12

this reminds me of some groovy code where I was evaluating the Boolean return of a function before the simpler variable check and it slowed things down significantly... to illustrate: (someBoolFunction()||x==5) vs (x==5||someBoolFunction())

+ 10

Aaah got it. Assumed same precedence. So it boils down to an OR expression..
Thank you Max && Udi Finkelstein !

+ 5

You got it 99% correct. The missing 1% you missed is that due to operator precedence, the && operator has a higher precedence than || and therefore,
The right hand side of the || expression, which as you said yourself, is not evaluated (because the 1st part is already true) includes the entire '++y && ++z' expression.

+ 4

The operator precedence is not necessarily the same thing as order of execution (evaluation). As a result, the above line can be explicitely reform as follow for clarifying the evaluation order
( ++x || (++y && ++z))
Once left side of || being evaluted to true, the right side (as you aware) is discarded.

+ 3

Petest Sam it is the logical or.
expression || expression is true if at least one of them is true

+ 2

in this question what does || stand for?

+ 2

AK-47 seems like i missed a "."

+ 2

Saurav Priyadarshi because the result lf the logical operation is true and true gets cast to 1 for printing

+ 1

Petest Sam
As Max mentioned, the expected result from a logical OR operation is pretty much straight forward. Note that any non-zero value is considered true or 1 when doing evaluation.
~example~
int x = 31;
int y = 0;
int z = -1;
bool b1 = x || y; // true
bool b2 = x || z; // true
bool b3 = y || y; // false

0

Max
I guess you meant logical OR operator, right? ;)

0

seems to be interested in this platform

0

Why is 1 not 2 printed in the beginning?
Since we can see that prefix increment is applied on x, so x should be incremented before being printed.

0

Saurav, because of the OR/AND operators, the term inside the brackets gets evaluated to a bool, with a value of true this is output as 1.

0

There you need precidence bro as you know that the higher precidence operator is %.
As here the &&op is the higher orecidence then the ||op.