Вот IL, созданный с помощью кода y += (int)(x++ - (float)y-- / ++a);
:
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))
.