有人可以解释一下,这段代码的每一步发生了什么:
y + =(int)(x ++-(float)y-- / ++ a)
导致变量发生变化。我想知道每一步都会发生什么。
我从开始:
x = 9
,y = 4
,a = 2.5
并以:
x = 10
,y = 11
,a = 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();
答案 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
推入堆栈-即4
。 y
的值在两个地方IL_0022
和IL_0031
中进行更新-第一次存储值3
,但是在11
时被覆盖。
IL是在关闭优化的情况下创建的。
最终结果是,此计算具有副作用,在有效计算x = 10
之后,它们会设置a = 3.5f
和y = 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 ...该页面显示了从最高优先级到最低优先级的运算符。每个部分中的运算符都具有相同的优先级。
希望这会有所帮助!