By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,264 Members | 1,795 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,264 IT Pros & Developers. It's quick & easy.

First statement always evaluated first?

P: n/a
I have an if statement that looks like this:

if(foo(&x) && x > y)
...

where the value of x is modified by foo, and the comparison between x
and y only makes sense after x has been modified by foo (and, of
course, if foo returns true). Am I guaranteed (assuming my compiler
generates correct code) that x > y is evaluated after foo(&x) returns?

Assuming things work the way I think they do, is it considered bad form
to write code like this? It saves me from doing something like the
following, which I think is ugly-looking:

if(foo(&x))
{
if(x > y)
{
...
}
}

Thanks,
Tim

Nov 15 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
tconkling wrote:
I have an if statement that looks like this:

if(foo(&x) && x > y)
...

where the value of x is modified by foo, and the comparison between x
and y only makes sense after x has been modified by foo (and, of
course, if foo returns true). Am I guaranteed (assuming my compiler
generates correct code) that x > y is evaluated after foo(&x) returns?
Yes in some sense. The order of evaluation is lexicographic, so first

foo(&x)

and *IF* foo is true then is (x > y) evaluated, otherwise it goes rigth
to the else statement.
Assuming things work the way I think they do, is it considered bad form
to write code like this? It saves me from doing something like the
following, which I think is ugly-looking:

if(foo(&x))
{
if(x > y)
{
...
}
}


They are equivalent.
Nov 15 '05 #2

P: n/a
tconkling wrote:
I have an if statement that looks like this:

if(foo(&x) && x > y)
...

where the value of x is modified by foo, and the comparison between x
and y only makes sense after x has been modified by foo (and, of
course, if foo returns true). Am I guaranteed (assuming my compiler
generates correct code) that x > y is evaluated after foo(&x) returns?

Assuming things work the way I think they do, is it considered bad form
to write code like this? It saves me from doing something like the
following, which I think is ugly-looking:

if(foo(&x))
{
if(x > y)
{
...
}
}

Thanks,
Tim

Yes, those forms are equivalent. Of course, you don't need the braces
around the inner if().
Nov 15 '05 #3

P: n/a
"tconkling" <tc*******@gmail.com> writes:
I have an if statement that looks like this:

if(foo(&x) && x > y)
...

where the value of x is modified by foo, and the comparison between x
and y only makes sense after x has been modified by foo (and, of
course, if foo returns true). Am I guaranteed (assuming my compiler
generates correct code) that x > y is evaluated after foo(&x) returns?

Assuming things work the way I think they do, is it considered bad form
to write code like this? It saves me from doing something like the
following, which I think is ugly-looking:

if(foo(&x))
{
if(x > y)
{
...
}
}


Yes, that's a special property of the "&&" operator (also "||" and
","). The "&&" operator evaluates its left operand first, then
evaluates the right operand only of the left operand evaluted to a
non-zero value. There's also a sequence point between the evaluation
of the left and right operands.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Nov 15 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.