This example is bad. Don’t do this:
int n = 1; cout << ++n * ++n << endl;
c.cc:2: warning: operation on 'n' may be undefined 9
Don’t do this, either:
short nums[] = {1, 2, 3, 4}; short *p = nums; cout << *p++ << ' '; cout << *p++ << '\n'; p = nums; cout << *p++ << ' ' << *p++ << '\n';
c.cc:8: warning: operation on 'p' may be undefined 1 2 1 2
Why not? Because, in both cases, the variable is being modified twice in the same expression.
<<
is an operator, just like +
is.
cout << a << b
is one expression.
(cout << a) << b
operator<<(operator<<(cout,a), b)
&&
||
?:
,
(the binary comma operator, not function arguments)
int a() { cout << 'A'; return 1; } int b() { cout << 'B'; return 2; } int main() { cout << a()+b() << '\n'; // Might print AB or maybe BA. cout << a() << b() << '\n'; // Might print A1B2, AB12, BA12 return 0; }
AB3 A1B2
You cannot determine the “correct” result by experimentation.
Break apart expressions, perhaps using explicit temporaries, to determine the order of evaluation of sub-expressions:
int a() { cout << 'A'; return 1; } int b() { cout << 'B'; return 2; } int main() { int c = a(); // Will print A c += b(); // Will print B cout << a(); // Will print A1 cout << b(); // Will print B2 return 0; }
ABA1B2