C++11 標準(5.17、expr.ass) は次のように述べています。
いずれの場合も、代入は、右オペランドと左オペランドの値の計算の後、代入式の値の計算の前に順序付けされます。不定順序の関数呼び出しに関しては、複合代入の操作は単一の評価です。
これは、式が次のことを意味します:
int a = 1, b = 10;
int c = (a+=1) + (b+=1);
if ( c == 10+1+1+1 ) {
printf("this is guaranteed");
} else {
printf("not guaranteed");
}
は常にc==23
?と評価されます。