Ten kod jest błędny. Wyniki mogą być różne w zależności od kompilatora, a dokładniej od kolejności w jakiej oblicza wyrażenia. Pisząc kod nigdy nie używaj takiej składni. Jeżeli zauważysz coś takiego w programie traktuj jako błąd.
Natomiast jeżeli jest to przykład na kolokwium/egzamin, to musisz stosować się do informacji od Najwyższego Autorytetu, czyli notatek z wykładów
Przykład 1
x += x++ + (x=1) //daje 4
operatory mają wartość i możliwy efekt uboczny
(x=1) ma wartość 1 i efekt uboczny przypisania 1 do x zapis ( x:=1 )
post-fixowy x++ ma wartość x i efekt uboczny przypisania x := x+1
itd.
Jaki będzie wynik? Jeżeli kompilator będzie obliczał od prawej strony, mamy (efekty uboczne w nawiasach kwadratowych]:
x += x++ + (x=1) [x := 1]
x += x++ + 1
x += 1 + 1 [x:=x+1, tj. x := 1+1]
x += 2 [x:=2 + 2, tj. x := 4]
wynik 4.
Ale kolejność wykonywania działań nie jest określona. Dla dodawania, kompilator może wygenerować kod obliczający najpierw wartość z lewej strony znaku + a później z prawej. Wtedy wynik zależy od tego jaka była wartość x przed wykonaniem kodu.
int x = 0;
x += x++ + (x=1)
x += 0 + (x=1) [x := 0 + 1 <- kiedy to przypisanie będzie wykonane jest także nieokreślone!]
x += 0 + 1 [dwa efekty uboczne, x := 0 + 1 oraz x := 1, akurat przypadkiem takie same]
x += 1 [x := x + 1, tj. x := 1 + 1]
wynik x = 2
int x = 10;
x += x++ + (x=1)
x += 10 + (x=1) [x := 10 + 1 <- kiedy to przypisanie będzie wykonane jest także nieokreślone!]
x += 10 + 1 [dwa efekty uboczne, x := 11 oraz x := 1, kolejność wykonania nieokreślona]
x += 11 [x := x + 11, tj. x := 11 + 11 lub x := 1 + 11]
wynik x = 22 lub x = 12
itd.