これはロジック実装ではなく、プレフィックス++を使用する必要があることはわかっていますが、このコードに興味があります。
int a = 1;
a = a++;
Console.Write(a);
結果は2になると思いますが、そうではありません。なぜ結果1なのですか?a
に等化された後a
、の値がa
増加しました。しかし、++操作は別の次元で実行されているようです:)
これはロジック実装ではなく、プレフィックス++を使用する必要があることはわかっていますが、このコードに興味があります。
int a = 1;
a = a++;
Console.Write(a);
結果は2になると思いますが、そうではありません。なぜ結果1なのですか?a
に等化された後a
、の値がa
増加しました。しかし、++操作は別の次元で実行されているようです:)
++
の後に置くと、古い値a
を返すように指示されてから、インクリメントされます。同時に、増分は割り当ての前に行われるため、古い値は失われます。同等のコードは次のとおりです。
int a = 1;
int temp_old_a = a; //temp_old_a is 1
a = temp_old_a + 1; //increments a to 2, this assignment is from the ++
a = temp_old_a; //assigns the old 1 value thus overwriting, this is from your line's assignment `a =` operator
Console.Write(a); //1
したがって、最終的に、増分された値がどのように破棄されるかを確認できます。一方、++
前に置く場合a
:
int a = 1;
a = ++a;
Console.Write(a); //2
それは次のように機能します:
int a = 1;
int temp_old_a = a;
temp_old_a = temp_old_a + 1;
a = temp_old_a; //assigns the incremented value from the ++
a = temp_old_a; //assigns again as per your original line's assignment operator `a =`
Console.Write(a); //2
この場合、式の一部として変数をインクリメントするときに、変数を再割り当てすることは通常意味がありません。ほとんどの場合、単にインクリメントするだけの方が良いでしょう。
int a = 1;
a++; //or ++a, but I find a++ is more typical
Console.Write(a); //2
通常、そのようなコードを表示する方が標準的であり、混乱がはるかに少なくなります(ご存知のとおり)。
a++
はポストインクリメントであり、それが機能する方法です。値を返した後、変数をインクリメントするかのように動作します。実際には値をインクリメントしますが、前の値を返します。
++a
一方、pre-incrementは、希望どおりに動作します。
なぜならa++
、ポストインクリメントです-最初に戻り値を返し、次にそれを増やします。この場合、使用する必要があるのは
int a=1;
a++;
Console.Write(a);
また
int a = 1;
a = ++a;
Console.Write(a);
++a
はプリインクリメントです-最初に値を増やし、次に増加した値を返します。
注:一部の言語は次の構文を受け入れます。
a = ++a
これはあなたが提案したように機能し、最初にインクリメントし、後でそれを返します:)
後置として使用される++オペランドは、値が使用された後にのみ変数をインクリメントするためです。プレフィックスとして++オペランドを使用する場合、変数はその値が使用される前にインクリメントされます。
例えば:
ケース1:後置の使用
int a = 1;
int b;
b = a++;
ケース2:プレフィックスの使用
int a = 1;
int b;
b = ++a;
「ケース1」ではb変数に値1が割り当てられ、「ケース2」では値2が割り当てられます。