我知道这不是一个逻辑实现,我知道我应该使用前缀 ++,但我对这段代码很好奇:
int a = 1;
a = a++;
Console.Write(a);
我希望结果是 2,但事实并非如此。为什么结果是 1?a
均衡到后a
,值a
增加。但似乎 ++ 操作在另一个维度执行:)
我知道这不是一个逻辑实现,我知道我应该使用前缀 ++,但我对这段代码很好奇:
int a = 1;
a = a++;
Console.Write(a);
我希望结果是 2,但事实并非如此。为什么结果是 1?a
均衡到后a
,值a
增加。但似乎 ++ 操作在另一个维度执行:)
放在++
后面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++
是一个post-increment,这就是它的工作方式。它的行为就像在返回变量值后递增变量一样。实际上它增加了它的值,然后返回之前的值。
++a
另一方面是pre-increment,它将按照您的意愿行事。
因为a++
是后增量 - 首先返回值然后增加它。在这种情况下,您应该只使用
int a=1;
a++;
Console.Write(a);
或者
int a = 1;
a = ++a;
Console.Write(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。
注意:某些语言接受以下语法:
a = ++a
这将按照您的建议工作,首先增加一个,然后返回它:)