问题
Why does the following compile in C++?
int phew = 53;
++++++++++phew ;
The same code fails in C, why?
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/3690141/multiple-preincrement-operations-on-a-variable-in-cc