Undefined behaviour?

0

Czy waszym zdaniem

 
int x = 2;
x+=x+=x+=2;

To jest undefined behaviour czy nie.
Jeżeli tak to dlaczego?

0

Kolejność operacji od prawej do lewej, żadnej niejednoznaczności.

1

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ć.

1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1