Warn about do nothing expressions?
Dominikus Dittes Scherkl
Dominikus.Scherkl at continental-corporation.com
Mon Mar 31 12:49:13 PDT 2014
On Monday, 31 March 2014 at 18:16:32 UTC, monarch_dodra wrote:
> On Monday, 31 March 2014 at 16:18:13 UTC, Dominikus Dittes
> Scherkl wrote:
>> (btw. I would _never_ever_ write a line like "i++;" That's
>> garbage. It should always be "++i;"
> Using "i++" can make a lot of sense, especially when you are
> iterating indexes.
Of course the post-increment is often very usefull - iff you use
it's return value. Therefore the semicolon.
i++;
as a whole line is very bad style, I think.
> i = i++;
>
> This does not conform to spec because "i" is written to and
> read to, all in between two sequence points. This is illegal,
> and produces undefined behavior.
Why?
If the operators had the same precedence, ok.
But ++ has to come first (no matter if post or pre).
something like
j = --i++;
yeah, that is undefined (pre- and post having same priority).
But does the spec really say a value may not at the same time be
read from and written to? Then i=i; would also be illegal. And
how about i += i; ? I think this is allowed and useful, ne?
What about i = ++i; (ok does nothing diffrent from ++i; but is
still ok and not a NOP)?
i = i++; is unambigous if the compiler doesn't optimize it. And
if it optimizes, it should replace it by NOP.
But it is likely that this is a typo or a logic-bug by the user,
so the compiler should instead warn or even forbid it.
As a general rule in one expression one variable should not be
allowed to be modified more than once.
e.g.
i++ = i;
j = i++ / i++;
i += i++;
etc. should all be forbidden.
> Go! Go! Undefined behavior!
More information about the Digitalmars-d
mailing list