テストコードは次のとおりです。
int main()
{
int a = 3;
int b = 4;
a = a + b - (b = a);
cout << "a :" << a << " " << "b :" << b << "\n";
return 0;
}
これをコンパイルすると、次の警告が表示されます。
> $ g++ -Wall -o test test.cpp test.cpp: In function ‘int main()’:
> test.cpp:11:21: warning: operation on ‘b’ may be undefined
> [-Wsequence-point]
操作を未定義にできるのはなぜですか?
私の理解によれば、(b = a)
()の優先順位が高いため、最初に部分式を評価する必要があります。したがって、b=aに設定します。次に、「+」と「-」の優先順位が同じであるため、式は左連想的に評価されます。したがって、a + b
次に評価する必要があり、最後にの結果を(b = a)
から差し引く必要がありますa + b
。ここでは、シーケンスポイントルールに違反していることはわかりません。