Evaluation of if's
Christopher R Volpe
volpe at camelback.crd.ge.com
Fri Jun 14 23:30:18 AEST 1991
In article <1991Jun13.184843.508 at ulkyvx.bitnet>, pgheit01 at ulkyvx.bitnet writes:
|>
|>Here's how ANSI C works. An expression (ANY EXPRESSION) returns a value in
|>much the same way as a function returns a value.
Really? Expressions "yield" values. Functions "return" them. The mechanism
is probably not all that similar, although this is an unimportant point
right now.
|> The expression (i = 2)
|>returns the value 2. The expression (i = 1) returns the value 1. No if's,
|>and's or entry points or any of that stuff.
Not relevant.
|>
|>The statement if ((i = 1) == (i = 2)) is valid.
No it's not. RTFS.
|>ANSI C evaluates conditions
|>from left to right.
No. It evaluates the left operand of a "||" or "&&" operator before
the right operand. But it's perfectly free to evaluate the right operand of
"==" before the left operand. Of course, order of evaluation is not
even the issue here anyway. The issue is assignment semantics. An
implementation
is free to do the following operations:
Store 2 in i.
Store 1 in i.
Get value of i as first operand.
Get value of i as second operand.
Compare fist operand to second operand.
|> *ALWAYS* ANSI C short-circuits a conditional statement
Irrelevant. There is no short circuiting in "((i=1) == (i=2))".
|>*ALWAYS* (unless you tell it not to)
How do you tell it not to short circuit "&&" or "||"??? You can't.
|>That makes possible the type of statment
|>
|>if ((x != 0) && (1/x < 9))
|> STATMENT;
|>(note that the inner sets of parentheses are not needed, and "< 9" could be
|>changed to whatever you need to test. Also "x != 0" can just be "x".)
What are you talking about? The above statement is correct, but has absolutely
nothing to do with this discussion.
|>
|>ANSI guarratees that the second statement will not be executed(and
division by
|>zero will not result) because the statment is false after the first condition
|>if x == 0.
Again, so what?
|>I did compile and run the code in question. The assignments do take place.
Oh good. "Proof by example".
|>i takes on the value 1 after the first condition is "tested", and i takes on
|>the value 2 after the second condition is tested. After the if-statement is
|>executed, i is and will irrepairably be 2.
Lucky you. The behavior is undefined. It can do anything, including what
you'd like it to do. Just don't rely on it.
|>My C teacher just loved to slip in questions like this one to see if anyone
|>knew the finer details of the precedence table. :-)
Good. Now that you're an expert on operator precedence you can learn the
finer details of assignment semantics.
==================
Chris Volpe
G.E. Corporate R&D
volpecr at crd.ge.com
More information about the Comp.lang.c
mailing list