The '=' operator in the C language is right associative. That means x = y = z; means x = (y = z); and not (x = y) = z; You can also think of the '=' operator being similar to other binary operators in the C language in that it returns the value of the assignment.
In the case where 'y' above is a volatile, I don't however know if the '=' operator returns the value asigned to 'y' or the value 'y' contains after the assignment. See http://encyclozine.com/Associativity for more info, or do a google on "C language right associative" Regards -Bill Knight R O SoftWare On Mon, 16 Aug 2004 22:08:05 +0200, Tadeusz Szczyrba wrote: >I wasn't describing the order of evaluation of operands because it's for >most of the operators with two-or-more operands unspecified (only &&, || >and ',' and '?:' operators have the order of evaluation specified >AFAIK). I was talking about value of the expression a = b. >In fact gcc for i386 has similar approach (checked it with type >promotion (unsigned int)a = (unsigned char) b = 0x1234 - a is not equal >0x1234 in the example) but don't know _precisely_ what the specs say. >OK - I've learnt for sure it's better not to expect anything concerning >return value of assignment operand. > regards, >W li¶cie z pon, 16-08-2004, godz. 21:07, nobo...@web.de pisze: >> Hi, >> >> ANSI-C (C99) says about the assignment operators (6.5.16.4): >> >> The order of evaluation of the operands is unspecified. >> >> This means it's compiler dependent and allowed to change the order e. g. >> every day or in random order (i would prefer random order). >> This is also true for many other operators. >> It's the same with function arguments; the order in which the arguments are >> evaluated is not defined; some compiler do it from left to right, some from >> right to left and other do optimize it to a case dependent order. >> >> You can by an exemplar of the standard at www.ansi.org. It's an pdf for >> about 15 $ which can be paied online with a visa card and will be mailed in >> a few minutes. >> >> Rolf >> >> >> mspgcc-users@lists.sourceforge.net schrieb am 16.08.04 14:39:04: >> > >> > Hi, >> > >> > First off, I would say that writing "a = b = c" is a bad idea, precisely >> > because it is not clear what it means. There are several interpretations, >> > some of which might be the same - what the author thinks it means, what the >> > reader thinks it means, what the compiler thinks it means, what ANSI C says >> > it means, what the reader thinks the author thinks it means, and so on. >> > >> > To my knowledge, ANSI C says "a = b = c" means "b = c; a = b;", which is >> > precisely how mspgcc is interpreting it. Since the registers you are using >> > are special registers, and therefore treated as volatile, this means that >> > IE2 must be re-read before assigning the value to a. When you use your >> > defines, the variables are not volatile, so gcc already knows what value it >> > has put into IE2, and can re-use it without reading IE2 - after all, since >> > IE2 is now declared not volatile, it must (as far as gcc knows) contain the >> > value you wrote to it. >> > >> > As far as I can see, mspgcc is therefore giving you exactly the code you >> > asked for. The correct way to write your code would therefore be: >> > IE1 = 0; >> > IE2 = 0; >> > >> > >> > David >> > >> > >> > > Hallo, >> > > >> > > <disclaimer> >> > > I don't claim i've found the bug in mspgcc I use, but it seems to me >> > > that the behaviour I've found in mspgcc is at least not ANSI C >> > > conformant (I don't have access to real ANSI C specification but the >> > > information I've found in ANSI by Kernighan & Ritchi confirm my >> > > suspicions). >> > > </disclaimer> >> > > >> > > The operator '=' assigns the right side operant, which can be lvalue or >> > > not lvalue expression to left side operand which has to be lvalue. >> > > But what's the value of the expression (a = b)? According to my >> > > knowledge it's not lvalue but value of the b operand assigned. >> > > How mspgcc behaves? >> > > >> > > Consider the little app, compiled for msp430x147 (only -mmcpu=msp430x147 >> > > for compiler given): >> > > >> > > int >> > > main() { >> > > IE1 = IE2 = 0; >> > > return 0; >> > > } >> > > >> > > The interesting is the expression IE1 = IE2 = 0; >> > > >> > > When IE1 and IE2 are defined exactly as in headers for msp430f14x as: >> > > sfrb(IE1,0x0000); >> > > sfrb(IE2,0x0001); >> > > The expression is compiled into (indepenant on level of optimisation) >> > > as: >> > > >> > > mov.b #llo(0), &0x0001 ; 9 *movqi3/3 [length = 2] >> > > mov.b &0x0001, r15 ; 10 *movqi3/5 [length = 2] >> > > mov.b r15, &0x0000 ; 11 *movqi3/2 [length = 2] >> > > >> > > It takes 3 words in mem, 11 cycles for execution according to my >> > > knowledge. >> > > >> > > When IE1 and IE2 are defined as: >> > > #define IE1 (*(unsigned char*)0x0000) >> > > #define IE2 (*(unsigned char*)0x0001) >> > > The expression is compiled into (independant on level of optimisation >> > > given by -O option) >> > > as: >> > > >> > > mov.b #llo(0), &1 ; 11 *movqi3/3 [length = 2] >> > > mov.b #llo(0), &0 ; 12 *movqi3/3 [length = 2] >> > > >> > > It takes 2 words in mem, 8 cycles for execution. >> > > >> > > And last but not least: the second output seems to be correct code, the >> > > first is not !!! >> > > (the second approach has one drawback: It doesn't produce good debug >> > > symbols, but one could make simple workaround for it with std library >> > > and linker). >> > > >> > > Consider the situation with: >> > > - interrupts (the memory cell content can always be changed in between) >> > > - special registers - some bits are read-only or undefined. >> > > >> > > After execution the expression produces the values: >> > > IE2: 0 >> > > IE1: 1 >> > > Probably because IE2 has some undefined bits. >> > > >> > > The mspgcc & C-library version I've tried was gcc-3.2.3 with patches >> > > from mspgcc CVS from 30.July.2004. >> > > I hope that mspgcc maintainers would have some ideas how to solve it, >> > > >> > > regards >> > > >> > > >> > > >> > > ------------------------------------------------------- >> > > SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media >> > > 100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 >> > > Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. >> > > http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 >> > > _______________________________________________ >> > > Mspgcc-users mailing list >> > > Mspgcc-users@lists.sourceforge.net >> > > https://lists.sourceforge.net/lists/listinfo/mspgcc-users >> > > >> > > >> > > >> > >> > >> > >> > >> > ------------------------------------------------------- >> > SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media >> > 100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 >> > Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. >> > http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 >> > _______________________________________________ >> > Mspgcc-users mailing list >> > Mspgcc-users@lists.sourceforge.net >> > https://lists.sourceforge.net/lists/listinfo/mspgcc-users >> >> >> >> >> >> ------------------------------------------------------- >> SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media >> 100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 >> Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. >> http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 >> _______________________________________________ >> Mspgcc-users mailing list >> Mspgcc-users@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/mspgcc-users >------------------------------------------------------- >SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media >100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 >Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. >http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 >_______________________________________________ >Mspgcc-users mailing list >Mspgcc-users@lists.sourceforge.net >https://lists.sourceforge.net/lists/listinfo/mspgcc-users