Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!nntp.coast.net!newsfeed.dacom.co.kr!usenet.kornet.nm.kr!agate!spool.mu.edu!uwm.edu!alpha1.csd.uwm.edu!bacon From: bacon@alpha1.csd.uwm.edu (Jason Wayne Bacon) Newsgroups: comp.unix.bsd.freebsd.misc Subject: Re: Compiler bug? Date: 3 Dec 1996 00:45:57 GMT Organization: University of Wisconsin - Milwaukee, Computing Services Division Lines: 50 Message-ID: <57vt85$top@uwm.edu> References: <55tf99$6b5@garuda.synet.net> <57hsae$cpm@uwm.edu> <57l5t1$hr0@uriah.heep.sax.de> NNTP-Posting-Host: 129.89.169.1 In article <57l5t1$hr0@uriah.heep.sax.de> joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch) writes: >bacon@alpha1.csd.uwm.edu (Jason Wayne Bacon) wrote: > >> > >> a=c[b++]|((c[b++])<<8); > >> The behaviour of this statement *is* well defined. > >No, it isn't. > >> The | operator evaluates left to right, so the operations >> *should* occur in the followign order: > >No. You're confusing expression evaluation with associativity. OK, you got me. I confused order of evaluation with associativity. Since the two ++ operators aren't bound to the same operand (as in a-b-c) associativity doesn't apply. ^ BTW, I also meant to say the ++ above, not |. Rough day. :-) >There are only two exceptions in C where the standard requires a >particular sequence of evaluation: the comma operator (obvious), and >the && and || operators (so you can say ``if (ptr && *ptr ...)''). >For everything else, only the associativity is defined. Yeah, and it's too bad. The C standard probably should define the order of evaluation in these cases to avoid ambiguity. To set everything straight, I came up with a simple example to prove myself wrong in my original statement: int c = 2; printf("%d\n",c++ * --c); This will produce 1 if --c is evaluated first, or 4 if c++ is done first. I actually got both possible results using various different compilers. The only time you have to worry is when using ++, --, or any of the various assignment operators, which alter a variable before the expression is completely evaluated. In other cases, it doesn't matter which operand is evaluated first. Ex. (a+b) * (c+d) Whether you evaluate (a+b) or (c+d) first, you get the same result. Sorry if I caused any confusion, -Jason