我知道这不是逻辑实现,我知道我应该使用前缀++,但我对这段代码感到好奇:
int a = 1;
a = a++;
Console.Write(a);
我希望结果是2,但事实并非如此。为什么重新开始1?
在a
已合并到a
后,a
的值会增加。但似乎++操作在另一个维度执行:)
答案 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.