【发布时间】:2013-01-05 20:15:06
【问题描述】:
我知道这不是一个逻辑实现,我知道我应该使用前缀 ++,但我对这段代码很好奇:
int a = 1;
a = a++;
Console.Write(a);
我希望结果是 2,但事实并非如此。为什么结果是 1?
在a 均衡为a 后,a 的值增加。但似乎++操作在另一个维度执行:)
【问题讨论】:
-
这类问题会问多少个版本?
标签: c#
我知道这不是一个逻辑实现,我知道我应该使用前缀 ++,但我对这段代码很好奇:
int a = 1;
a = a++;
Console.Write(a);
我希望结果是 2,但事实并非如此。为什么结果是 1?
在a 均衡为a 后,a 的值增加。但似乎++操作在另一个维度执行:)
【问题讨论】:
标签: c#
把++放在之后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
这将按照您的建议工作,首先增加一个,然后返回它:)
【讨论】:
因为用作后缀的 ++ 操作数仅在变量的值被使用后才会递增。 如果使用 ++ 操作数作为前缀,则变量会在使用其值之前递增。
例如:
案例一:后缀使用
int a = 1;
int b;
b = a++;案例2:前缀用法
int a = 1;
int b;
b = ++a;
在“case 1”中,b 变量将被赋值为 1,而在“case 2”中,b 变量将被赋值为 2。
【讨论】: