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

时间:2013-01-05 20:15:07

标签: c#

  

可能重复:
  If i == 0, why is (i += i++) == 0 in C#?

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

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

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

5 个答案:

答案 0 :(得分: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

通常更常见的是看到这样的代码,而不是那么令人困惑(正如你所发现的那样)。

答案 1 :(得分:5)

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

另一方面,

++a 预增量,其行为符合您的要求。

答案 2 :(得分:2)

Becouse a++是后增量 - 第一个返回值,然后增加它。在这种情况下,您应该只使用

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

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

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

答案 3 :(得分:0)

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

a = ++a

可以按照你的建议工作,增加第一个,然后再返回:)

答案 4 :(得分:0)

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

例如:

  

案例1:后缀使用

     

int a = 1;

     

int b;

     

b = a++;

     

案例2:前缀使用

     

int a = 1;

     

int b;

     

b = ++a;

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