[Этюд] Compound assignment
От: desco США http://v2matveev.blogspot.com
Дата: 16.09.08 20:10
Оценка: 55 (3)
Угадайте, что будет выведено на экран?

using System;

class Program
{
    static void Main()
    {
        var x = 5000;
        var y = 7777;
        x ^= y ^= x ^= y;
        Console.WriteLine(x);
        Console.WriteLine(y);
    }
}
Re: [Этюд] Compound assignment
От: Alexey M.  
Дата: 16.09.08 20:19
Оценка: 22 (2)
Здравствуйте, 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>

Угадал...
0
5000
Re: [Этюд] Compound assignment
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.09.08 06:49
Оценка:
Здравствуйте, desco, Вы писали:

D>Угадайте, что будет выведено на экран?


Признаюсь, что я с этим этюдом не справился, хотя когда увидел результат, смог понять что к чему.
Re[2]: [Этюд] Compound assignment
От: Аноним  
Дата: 17.09.08 07:56
Оценка: +1 :)
Здравствуйте, nikov, Вы писали:

N>Признаюсь, что я с этим этюдом не справился, хотя когда увидел результат, смог понять что к чему.


все дружно читаем ветку "Работа" — там предостаточно дебилов задающих подобные вопросы на интервью

з.ы. сноска: дебилов т.к. в на интерьвю
Re: [Этюд] Compound assignment
От: vdimas Россия  
Дата: 17.09.08 09:00
Оценка:
Здравствуйте, desco, Вы писали:

Угадал, а в чём, собственно, подвох?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: [Этюд] Compound assignment
От: Marat.Kh  
Дата: 17.09.08 09:07
Оценка:
Здравствуйте, 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
Re[2]: [Этюд] Compound assignment
От: MxKazan Португалия  
Дата: 17.09.08 09:12
Оценка:
Дык! Опять не под тем логином запостил... Дома один, на работе другой... Но теперь вроде везде корректно залогинился.
Пардон за офф.
Re: [Этюд] Compound assignment
От: 0K Ниоткуда  
Дата: 17.09.08 09:31
Оценка:
Здравствуйте, desco, Вы писали:

D>Угадайте, что будет выведено на экран?


Если по человечески переписать:

int x = 5000;
int y = 7777;
            
//x ^= y ^= x ^= y;

x ^= y;
y ^= x;
x ^= y;

Console.WriteLine(x);
Console.WriteLine(y);


то результат другой. Объясните плз.
Re[2]: [Этюд] Compound assignment
От: MxKazan Португалия  
Дата: 17.09.08 09:36
Оценка: 4 (1)
Здравствуйте, 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"
Re[3]: [Этюд] Compound assignment
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.09.08 10:10
Оценка:
Здравствуйте, 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"

Не в этом дело. Попробуй расписать анализ выражения целиком.
Re[4]: [Этюд] Compound assignment
От: MxKazan Португалия  
Дата: 17.09.08 10:28
Оценка:
Здравствуйте, 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 слева направо. Потом уже, расчитывает справа налево. В принципе, выражение получается тем же самым.
Re[5]: [Этюд] Compound assignment
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.09.08 10:32
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>так как левые операнды разрешаются сразу, то

MK>
x = 5000 ^ (y = 7000 ^ (x = 5000 ^ y))


Вот это совершенно верное объяснение.
Re[5]: [Этюд] Compound assignment
От: MxKazan Португалия  
Дата: 17.09.08 10:35
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>Правда есть еще и другая идея, что компилер вначеле разбирает данное выражение методом FILO слева направо. Потом уже, расчитывает справа налево. В принципе, выражение получается тем же самым.


Просьба этот бред не воспринимать буквально. Расчитывает, конечно же, не компилер, а FILO имелось ввиду применить ко всему процессу. Речь надо поставить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.