我对以下代码的结果感到困惑。为什么'b'在执行这些操作时会保留看似不正确的值?
int a = 0;
int b = 5;
a = b++;
b = b++;
Console.WriteLine("For b = b++; b=" + b.ToString()); // b should be 7 but it's 6
a = 0;
b = 5;
a = b--;
b = b--;
Console.WriteLine("For b = b--; b=" + b.ToString()); // b should be 3 but it's 4
a = 0;
b = 5;
a = b + 1;
b = b + 1;
Console.WriteLine("For b = b++; b=" + b.ToString());
输出
b=6
b=4
b=6
任何人都可以在C#中解释这种行为以及它是如何工作的吗?
答案 0 :(得分:4)
这确实是后缀运算符的行为,详见here。
例如,当你写:
b = b++;
发生以下情况:
b
的当前值b
递增,b
的保存值由后缀++
运算符b
。因此,b
确实将被赋予其原始值,并且递增的值将丢失。
答案 1 :(得分:1)
因为放在值之后的++
和--
运算符将计算为值本身,然后在评估之后递增/递减值。
所以:
int a = 0;
int b = a++;
运行此代码后,b
将等于0
,a
将等于1
。
这与使用运算符作为前缀相反:
int a = 0;
int b = ++a;
运行此代码后,b
将等于1
,a
将等于1
。
这是documented behavior,并且一直存在a long time。
答案 2 :(得分:0)
指令a = b ++存储在堆栈中但未评估,因为之后没有使用它。
要获得正确的结果,请使该指令有意义改变该行:
Console.WriteLine("For b = b++; b=" + b.ToString());
那个:
Console.WriteLine("For a = b++; a=" + a.ToString());
Console.WriteLine("For b = b++; b=" + b.ToString()); //should give 7
答案 3 :(得分:0)
使用时
int a = 0;
int b = 5;
a = b++;
b = b++;
您将a设置为6,然后将b设置为6。 当你将b写入命令行时,它会显示6,因为在递增b时从未使用过a。 如果你想使用一个,你必须做
int a = 1;
int b = 5;
b = b++;
b += a;
Console.WriteLine("For b = a + b++; b=" + b.ToString());
但总的来说,我认为这种增量没有任何用处。