C# 什么';发生在幕后所以代码返回1而不是43?
在一本书中发现了这一点,但解释太短了C# 什么';发生在幕后所以代码返回1而不是43?,c#,C#,在一本书中发现了这一点,但解释太短了 public class Program { int a = 0; private static void Main() { var val = new Program(); val.a += val.Foo(); Console.WriteLine(val.a); Console.ReadKey(); } private int Foo()
public class Program
{
int a = 0;
private static void Main()
{
var val = new Program();
val.a += val.Foo();
Console.WriteLine(val.a);
Console.ReadKey();
}
private int Foo()
{
a = a + 42;
return 1;
}
}
它是否与拳击有关?让我们看看:
// val.a = 0
Program val = new Program();
// val.a += val.Foo() can be rewritten as
// val.a = val.a + val.Foo() or initial value of val.a + result of val.Foo()
// val.a = 0 + 1
val.a += val.Foo();
// print out 1
Console.WriteLine(val.a);
编辑:如果您想利用副作用(在Foo()
方法中将a
分配给42
),您可以放置(而不是val.a=val.a+val.Foo()
):
在Foo()
上,始终返回1
正确代码:
int Foo()
{
a = a + 42;
return a;
}
这与拳击无关,这是操作顺序
class Program
{
int a = 0;
static void Main()
{
Program val = new Program();
val.a += val.Foo();
Console.WriteLine(val.a);
Console.ReadKey();
}
int Foo()
{
a = a + 42;
return 1;
}
}
所以发生的是
val.a += val.Foo();
基本上被改写为
val.a = val.a + val.Foo();
由于操作顺序的原因,以下是推送到堆栈上的内容:
val.a = 0
val.Foo = 1
结果将是43。这是一个操作顺序问题。
return 1
可能不是您想要的。这是一个书本上的小测验。您错过了练习的要点,它显示了操作顺序是如何工作的,预期的代码是正确的,演示的是a
在调用后变为1
,而不是43
。实际上,你的问题是“代码返回1而不是43”。代码中唯一的return
语句是return1代码>。很明显,为什么会这样。这是"演习"吗?;您故意编写了令人困惑的代码,并询问人们为什么它的行为方式是这样的?而且,如果你想知道为什么代码要向控制台写入一个特定的值,你应该问这个问题,而不是谈论“return”。是的,我认为它将是42+1,因为a
在Foo()
中被修改了,但是因为在调用Foo()之前操作已经有了一个0
操作将是0+1,而不是42+1。谢谢
val.a = 0
val.Foo = 1
val.a = val.Foo() + val.a;