Czy waszym zdaniem
int x = 2;
x+=x+=x+=2;
To jest undefined behaviour czy nie.
Jeżeli tak to dlaczego?
Czy waszym zdaniem
int x = 2;
x+=x+=x+=2;
To jest undefined behaviour czy nie.
Jeżeli tak to dlaczego?
Kolejność operacji od prawej do lewej, żadnej niejednoznaczności.
Nie znam niuansów standardu C++ na pamięć.
Ale widzę problem w tym wyrażeniu: zmienna x
jest odczytywana więcej niż raz, i zapisywana więcej niż raz.
Standard mówi, że pojedyncze wyrażenie może maksymalnie raz zmienną odczytać, i maksymalnie raz do zmiennej wartość zapisać.
W C++03 na pewno jest to UB: pomiędzy kolejnymi modyfikacjami x
nie ma sequence point - zmienna modyfikowana jest więcej niż raz w jednym wyrażeniu = undefined behavior. (Gdyby to nie był int
i operator byłby przeciążony to zupełnie inna historia, wtedy wszystko jest ok)
W C++11 nie stosuje się już pojęcia sequence point, ale w dalszym ciągu jest to UB. Jest tak:
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. (...) If a side effect on a scalar object is unsequenced relative to either anotherside effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
(1.9.15)
Wyrażenie jest takie:
x += (x += (x += 2));
Przyjrzyjmy się temu w środku:
x += (x += 2);
Kolejność obliczenia wartości x
po lewej stronie, oraz wartości (x += 2)
po prawej nie jest określona - wyrażenia te są unsequenced. Wyrażenie (x += 2)
ma skutki uboczne (zmiana wartości x
) a to po lewej oblicza wartość x
. Z powyższego cytatu wynika, że jeżeli takie operacje są unsequenced i dotyczą tej samej zmiennej to zachowanie jest niezdefiniowane.