I have some code
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
j = j++;
Console.WriteLine(j);
}
Why answer is 0 ?
I have some code
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
j = j++;
Console.WriteLine(j);
}
Why answer is 0 ?
これは++ インクリメントの仕組みによるものです。操作の順序は、この MSDN 記事で説明されています。これはここで見ることができます (この仕様を間違って読んでいる場合は、誰かが私を修正してください:)):
int j = 2;
//Since these are value objects, these are two totally different objects now
int intermediateValue = j;
j = 2 + 1
//j is 3 at this point
j = intermediateValue;
//However j = 2 in the end
値オブジェクトなので、その時点での 2 つのオブジェクト (j
と) は異なります。intermediateValue
古い j はインクリメントされましたが、同じ変数名を使用したため失われます。値オブジェクトと参照オブジェクトの違いについても読むことをお勧めします。
変数に別の名前を使用した場合は、この内訳をよりよく確認できます。
int j = 0;
int y = j++;
Console.WriteLine(j);
Console.WriteLine(y);
//Output is
// 1
// 0
これが同様の演算子を持つ参照オブジェクトである場合、これはおそらく期待どおりに機能します。特に、同じ参照への新しいポインターのみが作成される方法を指摘しています。
public class ReferenceTest
{
public int j;
}
ReferenceTest test = new ReferenceTest();
test.j = 0;
ReferenceTest test2 = test;
//test2 and test both point to the same memory location
//thus everything within them is really one and the same
test2.j++;
Console.WriteLine(test.j);
//Output: 1
ただし、元のポイントに戻ります:)
以下を実行すると、期待どおりの結果が得られます。
j = ++j;
これは、インクリメントが最初に発生し、次に代入が発生するためです。
ただし、++ は単独で使用できます。だから、私はこれを次のように書き直します
j++;
単純に翻訳すると
j = j + 1;
名前が示すように、ポストインクリメントは値が使用された後にインクリメントします
y = x++;
C# 言語仕様によると、これは次と同等です。
temp = x;
x = x + 1;
y = temp;
元の問題に適用するj
と、これらの操作の後も同じままであることを意味します。
temp = j;
j = j + 1;
j = temp;
逆のプリインクリメントを使用することもできます
x = x + 1;
y = x;
また
y = ++x;
MSDNの Postfix インクリメントおよびデクリメント演算子を参照してください