質問: --n / --n; cout << n << endl; } ``` このプログラムの実行結果が1になるのが理解できません。 どなたかご教授お願いします。
回答: こんにちは。 副作用完了点についてが分かりやすいですが、nの値を1つの式のなかで2回以上変更することは「未定義動作」です。 未定義動作に対して、コンパイラはどのように動作しても良いそうです。 「鼻から悪魔が飛び出しても良い」とまで言われてます。 これを踏まえて、コンパイラが何をやっているのか推測してみます。 --nは1nの値を1引いてから、2nを取り出します。1→2の実行順序は保証されてます。 これを2回行ってます。この時、最初の1→最初の2、次の1→次の2は保証されてますが、最初の1と次の2の実行順序はどちらが先でも問題ないですし、最初の1と最初の2も同様です。 結果が1になるということは、恐らく、最初の1→次の1→最初の2→次の2のような順序で実行されたのではないかと推測できます。-1/-1は1ですので。 なお、この結果は全く保証されません。たまたま今回そうなっただけです。ちょっと何か条件が変わっただけで結果が変わる可能性があります。ビルド・オプションをちょっと変えたとか、コンパイラがバージョン・アップした等。