Order of evaluation - aka hidden undefined behaviours.

monarch_dodra monarchdodra at gmail.com
Wed Sep 26 08:39:55 PDT 2012


On Wednesday, 26 September 2012 at 15:12:05 UTC, Alex Rønne 
Petersen wrote:
> On 26-09-2012 15:34, monarch_dodra wrote:
>> [SNIP]
>
> No it isn't. There's a perfectly sensible, sane, and intuitive 
> fix for this: always evaluate arguments left-to-right. No 
> exceptions.
>
> It's not that complicated.

You know, I think you are right on second though. However, it is 
a matter of not mistaking "left to right evaluation of arguments" 
with normal the associative behavior of operators.

EG: (a = (b = c) = d):
*a is evaluated
*b is evaluated
*c is evaluated
*(b = c) is evaluad into a temp called bc
*d is evaluated
*bc = d is evaluated into bcd
*a = bcd is evaluated.

So back to my example: (where i starts at 1)
x[i++] = ++i + 1;
*i++ is evaluated to 1, and i is now 2.
*x[i++] is now a reference to x[1]
*++i is evaluated to 3
*++i + 1 is 4
*x[1] becomes 4

Yeah... it looks like it works.



More information about the Digitalmars-d mailing list