为什么不"a = a ++"操作增加值"a"

pil*_*ust -1 c#

可能重复:
如果i == 0,为什么C#中的(i + = i ++)== 0?

我知道这不是一个逻辑实现,我知道我应该使用前缀++,但我很好奇这个代码:

int a = 1;
a = a++;
Console.Write(a);
Run Code Online (Sandbox Code Playgroud)

我希望结果是2,但事实并非如此.为什么重新开始1?经过a均衡后a,价值a增加了.但似乎++操作在另一个维度执行:)

Chr*_*air 16

++ 以后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
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它最终如何,抛弃增加的值.如果在另一方面,你把++ 之前a:

int a = 1;
a = ++a;
Console.Write(a); //2
Run Code Online (Sandbox Code Playgroud)

它的行为如下:

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当变量作为表达式的一部分递增时,通常没有意义重新分配变量.只是简单地增加它几乎总是更好:

int a = 1;
a++; //or ++a, but I find a++ is more typical
Console.Write(a); //2
Run Code Online (Sandbox Code Playgroud)

看起来像这样的代码通常更标准,而且不那么令人困惑(正如你已经发现的那样).


K-b*_*llo 5

a++是一个后增量,这就是它的工作方式.它的行为就像返回其值递增变量一样.实际上它会增加其值,但随后返回先前的值.

++a另一方面是预增量,它将按您的意愿运行.