Если скомпилировать этот код, а затем проверить его с помощью 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, тогда метод G вызывается со старым значением i и, наконец, , метод H вызывается с новым значением i. Это отдельный и не связан с приоритетом оператора.
http://stackoverflow.com/questions/2371118/how-do-the-post-increment-i-and-pre-increment-i-operators-work-in-java – kbunarjo
@kbunarjo Это Безразлично» Ответьте на мой вопрос. –
x уже был оценен до того, как он достигнет -x, поэтому x все равно 3. – kbunarjo