我有这个代码
static void Main(string[] args)
{
int x = 20;
int y = 35;
x = y++ + x++;
y = ++y + ++x;
Console.WriteLine(x);
Console.WriteLine(y);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
我期望输出为x = 57和y = 94.但是,执行时它给了我56和93.由于某种原因,后增量运算符没有在第3行执行.
这是因为我们将第3行的表达结果分配给x本身吗?是否存在后增量运算符不会按预期结果的任何其他方案.
谢谢.
kha*_*hik 12
int x = 20;
int y = 35;
// x = y++ + x++; this is equivalent of
tmp = 35 + 20; y++; x++; x = tmp;
// so here we have x = 55; y = 36
// y = ++y + ++x;
y ++; // 37
x ++; // 56;
y = x + y;
// so here we have y = 93, x = 56;
Run Code Online (Sandbox Code Playgroud)
C#中的规则非常简单.他们是:
所以在你的情况下,这会像这样崩溃; 我假装我们在C而不是C#中这样做,所以地址和解引用的地方更清楚.
x = y++ + x++;
Run Code Online (Sandbox Code Playgroud)
评估x的地址并存储它.
t1 = &x;
Run Code Online (Sandbox Code Playgroud)
评估y的地址.
t2 = &y;
Run Code Online (Sandbox Code Playgroud)
评估存储在刚计算的地址中的值.那是35.
t3 = *t2; // 35
Run Code Online (Sandbox Code Playgroud)
刚刚计算的值是表达式的值; 它是增量前的值.
在该值中添加一个.
t4 = t3 + 1; // 36
Run Code Online (Sandbox Code Playgroud)
将36存储在地址中.你现在是36岁.
*t2 = t4; // y = 36
Run Code Online (Sandbox Code Playgroud)
现在对x ++做同样的事情:
t5 = &x;
t6 = *t5; // 20
t7 = t6 + 1; // 21
*t5 = t7; // x = 21
Run Code Online (Sandbox Code Playgroud)
好的,现在我们必须做补充:
t8 = t3 + t6; // 35 + 20 = 55
Run Code Online (Sandbox Code Playgroud)
并将其分配给首先计算的地址:
*t1 = t8; // x = 55;
Run Code Online (Sandbox Code Playgroud)
在本声明的最后,x有三个值.20,21和55. y有两个值,35和36. x现在是55,y现在是36.
y = ++y + ++x;
Run Code Online (Sandbox Code Playgroud)
现在我们再次做同样的事情,除了这次我们使用增量后的值.跟着:
t1 = &y;
t2 = &y;
t3 = *t2; // 36
t4 = t3 + 1; // 37
*t2 = t4; // y = 37;
t5 = &x;
t6 = *t5; // 55
t7 = t6 + 1; // 56;
*t5 = t7; // x = 56;
t8 = t4 + t7; // 93
*t1 = t8; // y = 93;
Run Code Online (Sandbox Code Playgroud)
所以在这个陈述结束时,y有三个值:36,37和93. x有两个值:55和56. y现在是93而x现在是56.
我预计输出为x = 57和y = 94.
你为什么期待呢?您的期望与C#规范相悖; 我很想知道为什么你期望错误的结果.您是如何期望生成此代码的?您是否期望在分配后发生增量?他们为什么要那样做?增量运算符的值被计算时会发生增量,显然必须在添加之前发生,这显然必须在赋值之前发生.因此,在赋值后不会发生增量.
由于某种原因,后增量运算符未在第3行执行.
你到底怎么得出这个结论?我保证你肯定会被执行.如果你不相信我,请在调试器中逐步执行.