0

繰り返しますが、ばかげた質問です。

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
 int i = 0;
 i = i++;
 cout<<i;

 return 0;
}

私は10を期待していましたが、このプログラムの結果として出力されます。最初に0に等しいeingで作成された一時オブジェクト、次にiがインクリメントされ、次に一時オブジェクトが返され、iに割り当てられます。ちょうどによると:

5.2.6インクリメントとデクリメント[expr.post.incr]1後置++を適用して得られる値は、演算子を適用する前にオペランドが持っていた値です。[注:取得された値は元の値のコピーです]

MSVC2008とGCCで確認しました。少なくともgccはインクリメント文字列で警告を発行しますが、どちらも同じ結果になります。私はどこが間違っていますか?

4

1 に答える 1

0

の振る舞い

i = i++;

未定義です。単一の式が2つの異なる値を変数に割り当てる場合、C ++仕様では、何でも起こり得るとされています。古い値、2つの新しい値のいずれか、またはほとんど何でも取ることができます。これは、コンパイラーが単純な式をより積極的に最適化できるようにするためです。++コンパイラーは、例えば、より効率的であると考えた場合、割り当てと実行の順序を並べ替えることができます。

于 2011-01-08T23:40:27.607 に答える