Может ли кто-нибудь объяснить, как эти переменные меняются в C #? - PullRequest
0 голосов
/ 10 февраля 2019

Может кто-нибудь объяснить мне, что радует на каждом этапе этого кода: y + = (int) (x ++ - (float) y-- / ++ a), что приводит к изменению переменных.Я хотел бы знать, что происходит на каждом этапе.Я начинаю с: x = 9, y = 4, a = 2.5 и заканчиваю: x = 10, y = 11, a = 3.5 Спасибо!

 int x = 9;
 int y = 4;

 float a = 2.5f;

 Console.WriteLine("x = " + x);
 Console.WriteLine("y = " + y);
 Console.WriteLine("a = " + a);
 Console.WriteLine();

 Console.WriteLine("y += (int)(x++ - (float)y-- / ++a) = " + (y += (int)(x++ - (float)y-- / ++a)));
 Console.WriteLine();

 Console.WriteLine("x2 = " + x);
 Console.WriteLine("y2 = " + y);
 Console.WriteLine("a2 = " + a);
 Console.ReadKey();

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вот 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)).

0 голосов
/ 10 февраля 2019

ваш код преобразует некоторые числовые значения как INT и FLOAT, чтобы избежать ошибок чисел.

x ++ будет использовать текущее значение x, а затем после того, как оно будет использовано в этом операторе, оно будет увеличиваться на 1

++ a будет увеличивать значение +1, а затем будет использовать значение в операторе

y-- будет использовать текущее значение y, а затем после того, как оно будет использовано в этом оператореон будет уменьшаться на 1

y + = .... в основном будет делать "y = y + _", где _ - это вычисленное значение оператора

Для порядка, в котором выполняются операторы ... ссылка на документацию ... на этой странице показаны операторы, начиная с самого высокого приоритета до самого низкого.Операторы в каждом разделе имеют одинаковый уровень приоритета.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...