Ceea ce ai scris tu acolo în C++ este
undefined behaviour.
>> și
<< sunt operatori, iar în C++ nu există conceptul de
evaluare de la dreapta la stânga sau
de la stânga la dreapta, deci mai clar nu există conceptul de
ordinea evaluării. A nu se confunda cu asociativitatea operatorilor de la stânga la dreapta sau de la dreapta la stânga.
f() + g() + h() se evaluează ca
(f() + g()) + h(), dar
h() s-ar putea să fie funcția evaluată prima, și abia după să se treacă la paranteză.
În altă ordine de idei, când programezi cu
side effects, încearcă să nu apelezi două funcții în aceeași expresie, mai ales dacă este importantă ordinea în care ele sunt apelate.
Uite un exemplu. Eu când compilez cu g++-4.9, codul
int i = 0;
cout << i << " " << i++ << "\n";
îmi afișează
1 0. Cu toate astea, nu este indicat să te bazezi pe exemplul ăsta, încearcă să găsești altă soluție.
Un alt exemplu interesant.
int i = 0;
if (++i || ++i) {
}
cout << i << "\n";
afișează
1, pe când
int i = 0;
if (i++ || ++i) {
}
cout << i << "\n";
afișează
2. Motivul este acela că atunci când ai un
sau logic între doi operanzi, este suficient ca primul operand să fie evaluat ca
adevărat pentru ca expresia să fie evaluată și ea ca fiind adevărată. Prin urmare, dacă primul operand este adevărat, cel de-al doilea nici nu se mai evaluează deoarece se cunoaște valoarea expresiei deja. În caz contrar, dacă primul operand se evaluează ca
fals, atunci este necesară și evaluarea celui de-al doilea operand. Aici, cu toate că avem o expresie cu doi operanzi și un operator, ordinea evaluării lor
este definită. Mai exact, într-o expresie de forma să zicem
a || b există un
sequence point după
a. Existența unui
sequence point denotă faptul că toate
side effect-urile evaluărilor precedente trebuie să fie terminate și că nici un
side effect al vreunei evaluări ulterioare nu a avut loc.