Why does the following compile in C++?
int phew = 53; ++++++++++phew ; The same code fails in C, why?
Why does the following compile in C++?
int phew = 53; ++++++++++phew ; The same code fails in C, why?
Note: The two defect reports DR#637 and DR#222 are important to understand the below's behavior rationale.
For explanation, in C++0x there are value computations and side effects. A side effect for example is an assigment, and a value computation is determining what an lvalue refers to or reading the value out of an lvalue. Note that C++0x has no sequence points anymore and this stuff is worded in terms of "sequenced before" / "sequenced after". And it is stated that
If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
++v is equivalent to v += 1 which is equivalent to v = v + 1 (except that v is only evaluated once). This yields to ++ (v = v + 1) which I will write as inc = inc + 1, where inc refers to the lvalue result of v = v + 1.
In C++0x ++ ++v is not undefined behavior because for a = b the assignment is sequenced after value computation of b and a, but before value computation of the assignment expression. It follows that the asignment in v = v + 1 is sequenced before value computation of inc. And the assignment in inc = inc + 1 is sequenced after value computation of inc. In the end, both assignments will thus be sequenced, and there is no undefined behavior.
int a=4; ++a=5; would not invoke UB in C++0x, right?a = ++a does not invoke undefined behavior, but a = a++ does. What happened to "except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified"?That is because in C++ pre-increment operator returns an lvalue and it requires its operand to be an lvalue.
++++++++++phew ; in interpreted as ++(++(++(++(++phew))))
However your code invokes Undefined Behaviour because you are trying to modify the value of phew more than once between two sequence points.
In C, pre-increment operator returns an rvalue and requires its operand to be an lvalue. So your code doesn't compile in C mode.
++++i is well-defined for user-defined types, right?