Здравствуйте, desco, Вы писали:
D>Угадайте, что будет выведено на экран? D>
D>using System;
D>class Program
D>{
D> static void Main()
D> {
D> var x = 5000;
D> var y = 7777;
D> x ^= y ^= x ^= y;
D> Console.WriteLine(x);
D> Console.WriteLine(y);
D> }
D>}
D>
Здравствуйте, desco, Вы писали:
D>Угадайте, что будет выведено на экран?
D>
D>using System;
D>class Program
D>{
D> static void Main()
D> {
D> var x = 5000;
D> var y = 7777;
D> x ^= y ^= x ^= y;
D> Console.WriteLine(x);
D> Console.WriteLine(y);
D> }
D>}
D>
Блииин. Класс До меня не сразу доперло. И так и сяк скобки ставил
Но надо было читать доку по "The exclusive-OR assignment operator" про evaluated once
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, desco, Вы писали:
D>>Угадайте, что будет выведено на экран?
0K>Если по человечески переписать:
0K>
0K>int x = 5000;
0K>int y = 7777;
0K>//x ^= y ^= x ^= y;
0K>x ^= y;
0K>y ^= x;
0K>x ^= y;
0K>Console.WriteLine(x);
0K>Console.WriteLine(y);
0K>
0K>то результат другой. Объясните плз.
Правильно переписывается не так.
У меня получилось следующее:
var x = 5000;
var y = 7777;
x = 5000 ^ y;
y = 7777 ^ x;
x = 5000 ^ y;
А всё потому, что в msdn на тему "The exclusive-OR assignment operator" написано:
"An expression of the form x ^= y is evaluated as x = x ^ y except that x is only evaluated once"
Здравствуйте, MxKazan, Вы писали:
MK>А всё потому, что в msdn на тему "The exclusive-OR assignment operator" написано: MK>"An expression of the form x ^= y is evaluated as x = x ^ y except that x is only evaluated once"
Не в этом дело. Попробуй расписать анализ выражения целиком.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, MxKazan, Вы писали:
MK>>А всё потому, что в msdn на тему "The exclusive-OR assignment operator" написано: MK>>"An expression of the form x ^= y is evaluated as x = x ^ y except that x is only evaluated once"
N>Не в этом дело. Попробуй расписать анализ выражения целиком.
Собственно говоря, я только переписанный вариант имел ввиду.
Рассуждения следующие:
имеем
x ^= y ^= x ^= y;
разворачиваем в
x = x ^ (y = y ^ (x = x ^ y))
так как левые операнды разрешаются сразу, то
x = 5000 ^ (y = 7000 ^ (x = 5000 ^ y))
Правда есть еще и другая идея, что компилер вначеле разбирает данное выражение методом FILO слева направо. Потом уже, расчитывает справа налево. В принципе, выражение получается тем же самым.
Здравствуйте, MxKazan, Вы писали:
MK>Правда есть еще и другая идея, что компилер вначеле разбирает данное выражение методом FILO слева направо. Потом уже, расчитывает справа налево. В принципе, выражение получается тем же самым.
Просьба этот бред не воспринимать буквально. Расчитывает, конечно же, не компилер, а FILO имелось ввиду применить ко всему процессу. Речь надо поставить