XOR swap: ЧЯДНТ?
Нет, я не задрот оптимизации. :)
Просто мне стало интересно. 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) соответственно. Это нормально с точки зрения языка? Если да, то почему, где тут логика, ткните пальцем. |
Цитата:
var x = 10, y = 20; x -= (y = ((x += y), alert("x = " + x), x) - y); ещё примерчик, без игреков, чтобы было легче усвоить: x = 3; x += 3; // x = 6 x -= 9 - x; // 9 - 6 === 3 alert(x); x = 3; x -= ( 9 - ( x += 3 ) ); alert(x); // 0 после этого углубляемся в спеку :
во втором примере (моём) берётся значение икса (3), далее вычисляется значение правой стороны ( тоже 3), потом честно применяется к ним минус, получаем нуль. фишка в том, что X изменяется, но двиг уже взял его значение (старое), и не обновляет его (ящитаю) т.е. в числах всё происходит так : 3 - (9 - (3 + 3)); // 3 - (6 - 3) -> 3 - 3. |
melky, не перестаешь меня удивлять
Цитата:
Дзен-трансгуманист, думаю, абсолютно нормально. Попробую аргументировать: x -= (y = (x += y) - y); присвоение с операцией выполняется следующим образом: 1. сперва вычисляется выражения справа от [B]x -= ...[/B], а затем происходит присвоение 2. т.е. здесь [B]x += y[/B] его быть не может потому, что оно должно произойти позже (после вычисления всего выражения) 3. иными словами [B]x += y[/B] в данном случае работает как [B]x + y[/B] Это как бы мое мнение не опираясь на спецификацию :) Ну а коли речь зашла о нормальности, то подобные конструкции сами по себе ай-яй-яй ) |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Хоть всё уже и расписали, вставлю свои 5 копеек:
Запись вида x ^= y (как и подобные) эквивалентна записи вида x = x ^ y. Понятно, что если во втором операнде, т.е. в выражении y изменяется x, то на первый операнд оно уже не влияет, т.к. тот уже был вычислен. |
Ага, всё, теперь вкурил. Значит я просто неверно понимал механизм составного присваивания в JS.)
Спасибо всем. :) |
Цитата:
|
Часовой пояс GMT +3, время: 09:27. |