问题
Possible Duplicate:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
For the code below:
main() {
int i = 1 ;
cout << i << ++i << i++ ;
}
Why do I get the output as 331 instead of what was expected i.e 122 ?
( Same is the case even if I use printf
instead of cout ?)
回答1:
<<
is a function, namely something like ostream& operator<<(ostream& lhs, RhsType rhs)
.
cout << a;
is equivalent to
operator<<(cout, a);
The function returns lhs, that is return lhs
, - so in the above examples cout
is returned.
So your example
cout << i << ++i << i++ ;
is equivalent to
operator<<(operator<<(operator<<(cout, i), ++i), i++);
Correction C++ does not specify which order the increment operations are performed. It seems logical to you and me that the most nested would go first, but as far as the compiler is concerned it is free to execute the increment whenever it likes. It is the same behaviour as a function like myFunc(cout, i++, ++i, i)
where the order in which the increments are evaluated is undefined. The only thing guaranteed is the functions are evaluated inside to outside.
回答2:
The compiler is free to change the order of evaluation. You are changing i multiple times on the same statament which causes undefined behaviour.
回答3:
This is the reason why you should not write such code. I'm sure this will give you different results with different compilers. Using Visual C++ this gives you different output when run in Debug and Release versions.
回答4:
The output you observed can be explained in this way: The expression is evaluated right-to-left *before* being passed to cout
or printf
for output.
Starting value is 1
i++ is post increment, ie it will print the value (1) and then increment to 2: output 1
++i is pre-incremen, so 2 becomes 3 before it is printed: output 3
finally, the current value of i (3) is printed: output 3
These respective values are passed to the output routine.
To clarify, my answer only tries to explain the observed behavior, not lay down hard and fast rules for how the compiler or output routines order their evaluations/actions.
Having said that, this type of code is not good practice and quite likely to cause all sorts of problems that could be avoided.
来源:https://stackoverflow.com/questions/10925530/unexpected-output-in-cout-and-printf