このコードを見てみましょう:
int a = 1;
int b = ++a + ++a;
C++ (VS 2010) の結果は b = 6 ですが、C# の結果は b = 5 です。
何が起こっているのですか?結果が異なるのはなぜですか?
このコードを見てみましょう:
int a = 1;
int b = ++a + ++a;
C++ (VS 2010) の結果は b = 6 ですが、C# の結果は b = 5 です。
何が起こっているのですか?結果が異なるのはなぜですか?
それundefined behaviour
はC++にあります。値を複数回変更しようとしていますsequence points
(C++98/03 標準による)。
C++11 について
演算子のオペランドの値の計算は、演算子の結果の値の計算の前に並べられます。スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用、または同じスカラー オブジェクトの値を使用した値の計算に対して順序付けされていない場合、動作は未定義です。
例:
i = v[i++]; // the behavior is undefined i = i++ + 1; // the behavior is undefined
C# と C++ は異なる言語であり、セマンティクスも異なります。
C# は、まず最初に ++a を実行し、次に別の ++a を実行し、最後にこれら 2 つの式の加算を実行することを決定するため、結果は 5 になります。
C++ では、未定義の動作があります。結果は、2、3、4、5、6、34500、またはその他のいずれかになります。別の可能性のある結果は、マシュー・ワトソンが冷蔵庫のビールをすべて飲み干すことです。実際、何でも起こりえます。
一般に、2 つの異なる言語に同じ動作を期待することは意味がありません。それぞれが独自のルールに従います。
注:言語間の議論については、この質問Pre & post increment operator behavior in C, C++, Java, & C#を参照してください。