Zobacz odpowiedź Brian's na prostsze warunki,.
To przyczyna prawny standard C++ tak mówi, podkreślenia są moje ... Idąc w projekcie C++ 14
5.3.2 Przyrost i ubytek [expr.pre.incr]
Operand z przedrostka ++ jest modyfikowany przez dodanie 1 lub ustawienie na wartość true, jeśli jest jest bool (to użycie jest przestarzałe). Operand będzie podlegał modyfikowalnej l-wartości. Typ argumentu operacji powinien być typem arytmetycznym lub wskaźnikiem dla całkowicie zdefiniowanego typu obiektu. Wynikiem jest zaktualizowany operand ; jest to l-wartość i jest polem bitowym, jeśli operand jest polem bitowym. Jeśli x nie jest typu BOOL, wyrażenie ++ x jest odpowiednikiem x + = 1
Tak, jest to całkowicie legalne
#include <iostream>
using namespace std;
int main(){
int x =8;
int y = ++ ++ ++ ++ ++ ++ ++ ++ x;
cout << x << " " << y;
}
Output
16 16
1.9 Programu wykonanie [wersja wstępna]
... Jeśli efektem ubocznym na skalarnym obiektu jest unsequenced względem obu inny efekt uboczny na samym skalarnego obiektu lub obliczania wartości stosując wartość samym skalarnego obiektu, zachowanie jest niezdefiniowany. ...
I to przykład dołączone:
void f(int, int);
void g(int i, int* v) {
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // i becomes 9
i = i++ + 1; // the behavior is undefined
i = i + 1; // the value of i is incremented
f(i = -1, i = -1); // the behavior is undefined
}
Stało się to zbyt skomplikowane – Slava