Am 20.04.2011 12:01, schrieb Dmitry Olshansky:
On 20.04.2011 13:53, Jonathan M Davis wrote:
This was partially discussed before some time ago -
http://www.digitalmars.com/d/archives/digitalmars/D/postincrement_behaviour

_differences_between_dmd_and_gdc_47334.html


The following statement has different behaviours in dmd and gdc.

int x;
x = x++;


Where the backend for DMD interprets it as:

tmp = x;
x++;
x = tmp;

And the backend for GDC interprets it as:

x = x;
x++;


Skipping all undefined behaviour/which one is correct talk, an
alternative
suggestion would be to treat such nonsensical code as an error - like
"Cannot modify the value of a variable twice in the same expression."
- as
this kind of thing I would expect to be almost always a bug.
Actually, I would have expected postincrement and preincrement to be
identical
in this case. It was my understanding that the entire expression to
the right
of the assignment operator was evaluated before the assignment was
made, but I
guess I could see how that could be open to interpretation with
regards to the
postincrement operator.

No, I think post-increment is done after the whole expression is
evaluated, see the common C idiom:

*p++ = *q++;
it's always interpreted as:
*p = *q;
p++,q++; // or q++,p++;


IMHO it should be interpreted as

typeof(p) tmp_p;
typeof(q) tmp_q;
*((tmp_p = p), ++p, tmp_p) = *((tmp_q = q), q++, tmp_q);

In this case the overall semantics are identical but your expandation looks like gdc's and mine like dmd's. Therefore I think dmd's is more correct although less useful.

Generally I think it should just be an error to assign twice in the same expression.

Mafi

Reply via email to