有人可以解释一下这些变量在C#中的变化吗?

时间:2019-02-10 02:15:52

标签: c# variables

有人可以解释一下,这段代码的每一步发生了什么:     y + =(int)(x ++-(float)y-- / ++ a) 导致变量发生变化。我想知道每一步都会发生什么。 我从开始: x = 9y = 4a = 2.5 并以: x = 10y = 11a = 3.5 谢谢!

 int x = 9;
 int y = 4;

 float a = 2.5f;

 Console.WriteLine("x = " + x);
 Console.WriteLine("y = " + y);
 Console.WriteLine("a = " + a);
 Console.WriteLine();

 Console.WriteLine("y += (int)(x++ - (float)y-- / ++a) = " + (y += (int)(x++ - (float)y-- / ++a)));
 Console.WriteLine();

 Console.WriteLine("x2 = " + x);
 Console.WriteLine("y2 = " + y);
 Console.WriteLine("a2 = " + a);
 Console.ReadKey();

2 个答案:

答案 0 :(得分:1)

这是由代码y += (int)(x++ - (float)y-- / ++a);创建的IL:

IL_0017:  ldloc.1 (y) 4
IL_0018:  ldloc.0 (x) 4|9
IL_0019:  dup         4|9|9
IL_001A:  ldc.i4.1    4|9|9|1
IL_001B:  add         4|9|10
IL_001C:  stloc.0 (x) 4|9                   10 -> x
IL_001D:  conv.r4     4|9f
IL_001E:  ldloc.1 (y) 4|9f|4
IL_001F:  dup         4|9f|4|4
IL_0020:  ldc.i4.1    4|9f|4|4|1
IL_0021:  sub         4|9f|4|3
IL_0022:  stloc.1 (y) 4|9f|4                3 -> y
IL_0023:  conv.r4     4|9f|4f
IL_0024:  ldloc.2 (a) 4|9f|4f|2.5f
IL_0025:  ldc.r4 (1f) 4|9f|4f|2.5f|1f
IL_002A:  add         4|9f|4f|3.5f
IL_002B:  dup         4|9f|4f|3.5f|3.5f
IL_002C:  stloc.2 (a) 4|9f|4f|3.5f          3.5f -> a
IL_002D:  div         4|9f|1.142857f
IL_002E:  sub         4|7.857143f
IL_002F:  conv.i4     4|7
IL_0030:  add         11
IL_0031:  stloc.1 (y)                       11 -> y

最左列是内存位置,下一条是指令,第三列(括号中)是本地存储的变量,最后是用|压入堆栈的值,这些值用堆栈。我已经将整数显示为纯数字,并以f后缀浮动。

此代码的关键是首先将y推入堆栈-即4y的值在两个地方IL_0022IL_0031中进行更新-第一次存储值3,但是在11时被覆盖。

IL是在关闭优化的情况下创建的。

最终结果是,此计算具有副作用,在有效计算x = 10之后,它们会设置a = 3.5fy = 4 + (int)(9f - 4.0f / (2.5f + 1f))

答案 1 :(得分:0)

您的代码正在将一些数值转换为INT和FLOAT以避免数字错误。

x ++将使用x的当前值,然后在该语句中使用它后,它将增加1

++ a将使值+1递增,然后将使用语句中的值

y--将使用y的当前值,然后在该语句中使用它后将其递减1

y + = ....基本上将执行“ y = y + _”,其中_ 是语句的计算值

对于执行运算符的顺序... link to documentation ...该页面显示了从最高优先级到最低优先级的运算符。每个部分中的运算符都具有相同的优先级。

希望这会有所帮助!