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的。
答案 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.这是分开的 来自运算符优先级,与运算符优先级无关。