Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!caen!spool.mu.edu!olivea!uunet!sdl.mdcbbs.com!daniel From: daniel@sdl.mdcbbs.com Newsgroups: comp.lang.c Subject: Re: Evaluation of if's Message-ID: <1991Jun16.154628.1@sdl.mdcbbs.com> Date: 16 Jun 91 14:46:28 GMT Article-I.D.: sdl.1991Jun16.154628.1 References: <20273@crdgw1.crd.ge.com> <1991Jun7.011938.11342@wdl1.wdl.loral.com> <1991Jun13.184843.508@ulkyvx.bitnet> Distribution: usa Organization: Shape Data Ltd. (McDonnell Douglas M&E, Cambridge UK) Lines: 58 Nntp-Posting-Host: shapeg Nntp-Posting-User: daniel In article <1991Jun13.184843.508@ulkyvx.bitnet>, pgheit01@ulkyvx.bitnet writes: > In article <1991Jun7.232119.17834@cs.ucla.edu>, jon@maui.cs.ucla.edu (Jonathan Gingerich) writes: >> Having raised exactly this subject several months ago, let me point out >> that both sides are making valid points. There are two distinct things >> going on: >> >> 1. The description of the value of an assignment expression is sufficiently >> ambiguous in both K&RI and ANSI as to make the variability of >> ((i=1)==(i=2)) >> a reasonable question. This is not directly answered in the FAQ. It is >> not a `order of evaluation' question. It is not obvious. >> >> 2. There is no question that there is a rule in ANSI only, which says that >> expression which access the same location more than once are undefined. >> The above expression is undefined as is any other expression (to the >> best of my knowledge) that would illustrate a difference in the evaluation >> of an assignment expression. >> >> Jon. > > > AAAAAARRRRRGGGGHHHHH! > > Here's how ANSI C works. An expression (ANY EXPRESSION) returns a value in > much the same way as a function returns a value. 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. > > The statement if ((i = 1) == (i = 2)) is valid. ANSI C evaluates conditions > from left to right. *ALWAYS* ANSI C short-circuits a conditional statement > *ALWAYS* (unless you tell it not to) 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".) > > 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. > > I did compile and run the code in question. The assignments do take place. > 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. > > My C teacher just loved to slip in questions like this one to see if anyone > knew the finer details of the precedence table. :-) > > Paul == pgheit01@ulkyvx.bitnet > > Disclaimer: How could U of L really accept anything this well-defined as an > official policy? -- Daniel Dignam Shape Data Limited (McDonnell Douglas) Internet: daniel@sdl.mdcbbs.com 46 Regent Street UUCP: ...!uunet!sdl.mdcbbs.com!daniel Cambridge CB2 1DB Voice: +44 223 316673 Fax: +44 223 316931 United Kingdom