你以前试过这个吗?
static void Main(string[] args)
{
int x = 10;
x = x++;
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
产量:10.
但对于
static void Main(string[] args)
{
int x = 10;
x++;
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
产量:11.
谁能解释为什么这个?
Bri*_*ndy 73
X ++将增加该值,但随后返回其旧值.
所以在这种情况下:
static void Main(string[] args)
{
int x = 10;
x = x++;
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
你只有11点的X,然后它回到10,因为10是(x ++)的返回值.
你可以改为做同样的结果:
static int plusplus(ref int x)
{
int xOld = x;
x++;
return xOld;
}
static void Main(string[] args)
{
int x = 10;
x = plusplus(x);
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
还值得一提的是,如果您愿意,您的预期结果为11:
static void Main(string[] args)
{
int x = 10;
x = ++x;
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 57
在赋值中,x = x++您首先提取x用于评估右侧表达式的旧值,在本例中为"x"; 然后,增加x1.最后,x通过赋值语句将表达式evaluate(10)的结果赋值给.
也许等效的代码会使困境变得清晰:
var tmp = x;
x++;
x = tmp;
Run Code Online (Sandbox Code Playgroud)
这相当于您x = x++在C#中的代码.
Vin*_*nie 15
x ++的行为是增加x但返回增量前的值.由于这个原因,它被称为后增量.
所以x = x ++; 简单地说
1.然后返回值
2.然后增加x
3.将x的原始值(在步骤1中返回)分配给x.
x++;
Run Code Online (Sandbox Code Playgroud)
执行以下操作:
int returnValue = x;
x = x+1;
return returnValue;
Run Code Online (Sandbox Code Playgroud)
如您所见,保存原始值,x递增,然后返回原始值.
这最终做的是将值保存在某处,设置x等于11,然后返回10,这会导致x被设置回10.注意x实际上在几个周期内变为11(假设没有编译器优化) .