关于c#:为什么不“a = a ++”操作增加值“a”


Why Don't “a=a++” Operation Increase The Value “a”

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
If i == 0, why is (i += i++) == 0 in C#?

我知道这不是逻辑实现,我知道我应该使用prefix+,但我对这段代码很好奇:

1
2
3
int a = 1;
a = a++;
Console.Write(a);

我预计结果是2,但事实并非如此。为什么是结果1?当aa相等后,a的值增加。但似乎++操作在另一个维度中执行:)


++放在a之后,告诉它返回旧值,然后递增。同时,递增发生在赋值之前,因此会丢失旧值。以下是等效代码:

1
2
3
4
5
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之前:

1
2
3
int a = 1;
a = ++a;
Console.Write(a); //2

它的作用是:

1
2
3
4
5
6
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

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

1
2
3
int a = 1;
a++; //or ++a, but I find a++ is more typical
Console.Write(a); //2

看到这样的代码通常更标准,而且更不容易混淆(如您所发现的)。


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

另一方面,++a是预增量,它将按您想要的方式工作。


因为a++是后递增-先返回值,然后再增加。在这种情况下,只能使用

1
2
3
int a=1;
a++;
Console.Write(a);

1
2
3
int a = 1;
a = ++a;
Console.Write(a);

++a为先增后回增。


因为用作后缀的++操作数只在变量值被使用之后才增加变量的值。如果使用++操作数作为前缀,则变量的值将在使用之前递增。

例如:

Case 1: postfix usage

int a = 1;

int b;

b = a++;

Case 2: prefix usage

int a = 1;

int b;

b = ++a;

在"情况1"中,B变量的赋值为1,在"情况2"中的赋值为2。


注意:有些语言接受以下语法:

1
a = ++a

它会按照您的建议工作,先递增一个,然后返回它:)