On 2009-05-11 05:49:01 -0400, Georg Wrede <[email protected]> said:

Andrei Alexandrescu wrote:
Consider:

uint fun();
int gun();
...
int[] a = new int[5];
a[fun] = gun;

Which should be evaluated first, fun() or gun()?

arra[i] = arrb[i++];

arra[i++] = arrb[i];

I'm not sure that such dependences are good code.

By stating a definite order between lvalue and rvalue, you would actually encourage this kind of code.

Well, I agree with you that we shouldn't encourage this kind of code. But leaving it undefined (as in C) isn't a good idea because even if it discourages people from relying on it, it also makes any well tested code potentially buggy when switching compiler.

You could simply make it an error in the language to avoid that being written in the first place. But even then you can't catch all the cases statically. For instance, two different pointers or references can alias the same value, as in:

        int i;
        func(i, i);

        void func(ref int i, ref int j)
        {
                arra[i++] = arrb[j]; // how can the compiler issue an error for 
this?
        }

So even if you make it an error for the obvious cases, you still need to define the evaluation order for the ones the compiler can't catch.

And, by the way, I don't think we should make it an error even for the so-called obvious cases. Deciding what's obvious and what is not is going to complicate the rules more than necessary.


--
Michel Fortin
[email protected]
http://michelf.com/

Reply via email to