在变量分配之前,前/后增量运算符如何表现?

时间:2016-12-28 18:18:00

标签: c# operators operator-precedence

int x=3, y=4, n=0;
int n = x * y / --x;

此代码将n计算为6,但我认为它是4;因为--x是一个预先递减运算符,其优先级高于*/所以它是2 * 4 / 2我认为它是2*4而不是{{1}因为3*4已经减少,所以我在这里缺少什么?同样的问题被问到here,但答案是特定于PHP的。

1 个答案:

答案 0 :(得分:2)

如果我们编译此代码然后使用ildasm检查它,我们会得到以下说明(使用https://en.wikipedia.org/wiki/List_of_CIL_instructions翻译):

 IL_0000:  nop          // I compiled in debug mode, this does nothing
 IL_0001:  ldc.i4.3     // Push 3 onto the stack as int32.  
 IL_0002:  stloc.0      // Pop a value from stack into local variable 0.
 IL_0003:  ldc.i4.4     // Push 4 onto the stack as int32.  
 IL_0004:  stloc.1      // Pop a value from stack into local variable 1.
 IL_0005:  ldloc.0      // Load local variable 0 onto stack.
 IL_0006:  ldloc.1      // Load local variable 1 onto stack.
 IL_0007:  mul          // Multiply values.
 IL_0008:  ldloc.0      // Load local variable 0 onto stack.
 IL_0009:  ldc.i4.1     // Push 1 onto the stack as int32.  
 IL_000a:  sub          // Subtract value2 from value1, returning a new value.
 IL_000b:  dup          // Duplicate the value on the top of the stack.
 IL_000c:  stloc.0      // Pop a value from stack into local variable 0.    
 IL_000d:  div          // Divide two values to return a quotient or floating-point result. 
 IL_000e:  stloc.2      // Pop a value from stack into local variable 2.
 IL_000f:  ret          // Return from method, possibly with a value.   

这表明表达式是从左到右进行评估,即使--x位于*/之前。

C#语言规范(第7.3节操作员)中也记录了这一点:

  

表达式中运算符的求值顺序由   运算符的优先级和相关性(§7.3.1)。

     

表达式中的操作数从左到右进行计算。对于   例如,在F(i)+ G(i ++)* H(i)中,使用旧的方法调用方法F.   i的值,然后使用旧的i值调用方法G,并且,   最后,使用i的新值调用方法H.这是分开的   来自运算符优先级,与运算符优先级无关。