I'm very convinced with the explanation I've found that said that i = ++i
is not undefined as far as C++0x is concerned, but I'm unable to judge whether the behavior of i += ++i
is well-defined or not. Any takers?
When we run a code, sometimes we see absurd results instead of expected output. So, in C/C++ programming, undefined behavior means when the program fails to compile, or it may execute incorrectly, either crashes or generates incorrect results, or when it may fortuitously do exactly what the programmer intended.
Unspecified behavior is different from undefined behavior. The latter is typically a result of an erroneous program construct or data, and no requirements are placed on the translation or execution of such constructs.
C and C++ have undefined behaviors because it allows compilers to avoid lots of checks. Suppose a set of code with greater performing array need not keep a look at the bounds, which avoid the needs for complex optimization pass to check such conditions outside loops.
No thread of execution can execute forever without performing any of these observable behaviors. Note that it means that a program with endless recursion or endless loop (whether implemented as a for-statement or by looping goto or otherwise) has undefined behavior.
The reasoning that makes i = ++i
well-defined can equally be used to prove that i += ++i
must also be well-defined.
i += ++i
is equivalent to i += (i += 1)
and the new sequencing rules require that the assignment takes place before the value-computation of the i += 1
sub-expression.
This means that the result of the expression i += ++i
must be the same as for i = 2 * i + 1
.
Edit: I have to revise my answer, because the behaviour is undefined after all.
The behaviour of i += ++i
is undefined, because the value-computations of the sub-expressions i
(left-hand side argument) and ++i
are unsequenced in relation to each other and one of them contains an update of the object i
.
This is not a problem for the expression i = ++i
, because there the i
on the left-hand side does not undergo an lvalue-to-rvalue conversion, which does happen in the i += ++i
case.
On a side-note: Don't write such code in any serious project. It relies too much on exactly knowing the sequencing rules and there will be many people who either don't properly understand the sequencing rules, are unaware of the change in the rules that is the result of DR 637 or get tripped up by missing some important aspects of the expression in question (as happened to me when composing the first revision of this answer).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With