2016-12-28 3 views
0
int x=3, y=4, n=0; 
int n = x * y/--x; 

Этот код вычисляет n как 6, но я думал, что это будет 4; поскольку --x является оператором предекремент и имеет более высокий приоритет, чем * и / так было бы 2 * 4/2 я предположил, что это 2*4 и не 3*4, как x уже декрементируется, так что я здесь отсутствует? Тот же вопрос был задан here, но ответ был специфичным для PHP.Как работает оператор pre/post-increment перед распределением переменных?

+0

http://stackoverflow.com/questions/2371118/how-do-the-post-increment-i-and-pre-increment-i-operators-work-in-java – kbunarjo

+0

@kbunarjo Это Безразлично» Ответьте на мой вопрос. –

+0

x уже был оценен до того, как он достигнет -x, поэтому x все равно 3. – kbunarjo

ответ

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, тогда метод G вызывается со старым значением i и, наконец, , метод H вызывается с новым значением i. Это отдельный и не связан с приоритетом оператора.

+0

Можете ли вы привести пример оценки LTR без использования функций, просто операторов? –

+1

Ваш пример один. Операнды оцениваются LTR ('x', затем' y', затем '--x').Порядок _operations_ определяется приоритетом оператора, но сами _operands_ оцениваются слева направо. –

+0

То, что написал @D Stanley, было именно тем, что я собирался сказать. Существует разница между операндами и операторами. Приоритет оператора определяет порядок обработки операндов, но перед обработкой выражения все операнды оцениваются слева направо, независимо от операторов в выражении. – mstaessen

Смежные вопросы