Нет, я не задрот оптимизации.
Просто мне стало интересно.
var x = 10, y = 20;
x ^= y;
y ^= x;
x ^= y;
alert("x = " + x + ", y = " + y); // Всё ништяк
x = 10; y = 20;
x ^= (y ^= (x ^= y));
alert("x = " + x + ", y = " + y); // WTF???
Аналогичная операция через обычную арифметику:
var x = 10, y = 20;
x += y;
y = x - y;
x -= y;
alert("x = " + x + ", y = " + y); // Всё ништяк
x = 10; y = 20;
x -= (y = (x += y) - y);
alert("x = " + x + ", y = " + y); // И тут та же фигня
Выходит, что и тут и там в самом левом "икс" исходное значение сохраняется вплоть до последней операции, тогда как должно было измениться немедленно при (x ^= y) и (x += y) соответственно.
Это нормально с точки зрения языка?
Если да, то почему, где тут логика, ткните пальцем.