Правила в C# чрезвычайно просты. Это:
- Подвыражения выражения оцениваются ВЛЕВО В ПРАВО, период, конец рассказа.
- побочный эффект оператора приращения происходит, когда оператор оценивается.
Так что в вашем случае это разрушается следующим образом; Я буду притворяться, что мы делаем это в C вместо C#, чтобы там, где адреса и различия были более понятными.
x = y++ + x++;
Оцените адрес x и сохраните его.
t1 = &x;
Оцените адрес y.
t2 = &y;
Оценить значение, хранящееся в только что вычисленном адресе. Это 35.
t3 = *t2; // 35
Вычисленное значение является значением выражения; это значение до приращение.
Добавьте одно значение.
t4 = t3 + 1; // 36
Магазин 36 в адресе. y теперь 36.
*t2 = t4; // y = 36
Теперь сделайте то же самое для й ++:
t5 = &x;
t6 = *t5; // 20
t7 = t6 + 1; // 21
*t5 = t7; // x = 21
ОК, теперь мы должны сделать дополнение:
t8 = t3 + t6; // 35 + 20 = 55
и назначить, что по адресу, рассчитанном на первое:
*t1 = t8; // x = 55;
В конце этого утверждения x имеет имеет три значения. 20, 21 и 55. У имеет два значения, 35 и 36. х теперь 55 и у теперь 36.
y = ++y + ++x;
Теперь мы снова делаем то же самое, но на этот раз мы используем значение после того, как приращения. Следуйте по:
t1 = &y;
t2 = &y;
t3 = *t2; // 36
t4 = t3 + 1; // 37
*t2 = t4; // y = 37;
t5 = &x;
t6 = *t5; // 55
t7 = t6 + 1; // 56;
*t5 = t7; // x = 56;
t8 = t4 + t7; // 93
*t1 = t8; // y = 93;
Так что к концу этого утверждения у имело три значения: 36, 37 и 93. х имеет два значения: 55 и 56 лет теперь 93 и х теперь 56.
Я ожидал, что выход будет х = 57, у = 94.
Почему вы ожидаете, что? Ваше ожидание противоречило спецификации C#; Мне было бы интересно узнать, почему вы ожидали неправильного результата. Как вы ожидали, что код для этого будет сгенерирован? Ожидали ли вы приращения после задание? Почему они это сделали? Приращение происходит, когда значение оператора инкремента оценивается и, очевидно, должно произойти до дополнение, которое, очевидно, должно произойти до назначения. Таким образом, приращение не может произойти после задание.
По какой-то причине оператор пост прирост не получает выполненный в соответствии 3.
Как на земле, вы прибудете к такому выводу? Уверяю вас, это, безусловно, выполняется. Шаг за шагом в отладчике, если вы мне не верите.
Просто подсказка: сценарии, подобные этому, намного легче понять, если вы поместите каждый тестовый пример в отдельную функцию. Проверка того, что происходит во втором задании, излишне затруднена из-за первого назначения. –