-1

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

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

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

我希望结果是 2,但事实并非如此。为什么结果是 1?a均衡到后a,值a增加。但似乎 ++ 操作在另一个维度执行:)

4

5 回答 5

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

所以你可以看到它最终是如何丢弃增加的值的。另一方面,如果你把++ 之前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

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

于 2013-01-05T20:17:02.843 回答
5

a++是一个post-increment,这就是它的工作方式。它的行为就像在返回变量值递增变量一样。实际上它增加了它的值,然后返回之前的值。

++a另一方面是pre-increment,它将按照您的意愿行事。

于 2013-01-05T20:17:35.357 回答
2

因为a++是后增量 - 首先返回值然后增加它。在这种情况下,您应该只使用

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

或者

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

++a是预增量 - 首先增加值,然后返回增加的值。

于 2013-01-05T20:17:27.180 回答
0

因为用作后缀的 ++ 操作数仅在使用其值后才递增变量。如果使用 ++ 操作数作为前缀,则变量会在使用其值之前递增。

例如:

案例一:后缀使用

int a = 1;

int b;

b = a++;

案例2:前缀使用

int a = 1;

int b;

b = ++a;

在“case 1”中,b 变量将被赋值为 1,而在“case 2”中,b 变量将被赋值为 2。

于 2013-01-05T20:27:53.753 回答
0

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

a = ++a

这将按照您的建议工作,首先增加一个,然后返回它:)

于 2013-01-05T20:21:39.887 回答