セミコロンの前にシーケンスポイントがないことは理解していますが、式で古い値2を使用するための逆参照ポインターのもっともらしい説明はありますか?
それとも、それを未定義の振る舞いとして単純に置くことができますか?
int i=2;
int *x=&i;
*x+=*x+=i+=7;
結果:
i= 13
セミコロンの前にシーケンスポイントがないことは理解していますが、式で古い値2を使用するための逆参照ポインターのもっともらしい説明はありますか?
それとも、それを未定義の振る舞いとして単純に置くことができますか?
int i=2;
int *x=&i;
*x+=*x+=i+=7;
結果:
i= 13
これは「単に」未定義の動作です。
とは言うものの、コンパイラはおそらく、の値をi
1回読み取り、すべての演算を実行してから、の新しい値を格納するコードを出力しますi
。
実際の説明を見つけるための明白な方法は、コンパイラーによって生成されたアセンブリーを調べることです。
動作は未定義ではありません。コンパイラが式を分解し、中間結果をスタックにプッシュする方法に依存します。2つ*x
のsが最初に計算され(両方とも2に等しい)、スタックにプッシュされます。次にi
、7が追加されて9になります。次に、2*x
に等しい2番目のがスタックから引き出されて追加されて11になります。次に、最初*x
のがスタックから引き出されて11に追加されて13になります。
ここで何が起こっているかについてのヒントについては、逆ポーランド記法を調べてください。