gcc コンパイラが変数の値を最適化することを決定する基準を知りたいです。ここにサンプルがあります
int a=2;
printf("%d %d\n",a++,++a);
それは出力を与える
3 4
なぜ gcca
はポストインクリメントではなくプレインクリメントで最適化して最新の値を与えるのですか?どの基準で決定を下しますか?
gcc コンパイラが変数の値を最適化することを決定する基準を知りたいです。ここにサンプルがあります
int a=2;
printf("%d %d\n",a++,++a);
それは出力を与える
3 4
なぜ gcca
はポストインクリメントではなくプレインクリメントで最適化して最新の値を与えるのですか?どの基準で決定を下しますか?
コードには 2 つの問題があります。
a
いわゆる「シーケンス ポイント」を間に置かずに、同じ式で 2 回の値を変更します。これは未定義の動作であり、何でも発生する可能性があります。詳細については、FAQ を参照してください。
関数に渡されるパラメーターに副作用があり、その副作用は ++ インクリメントです。関数パラメーターの評価の順序はunspecified behaviorです。これは、コンパイラーが何らかの方法でそれを実装したことを意味しますが、その方法を知ることはできません。関数ごとに異なる場合があり、コンパイラごとに異なることは確かです。
未定義または未指定の動作に依存するコードを書くべきではありません。FAQ にさらに詳しい情報があります。
未定義の動作です。引数が評価される特定の順序はありません。