Показать сообщение отдельно
  #2 (permalink)  
Старый 20.10.2012, 11:56
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Дзен-трансгуманист
Выходит, что и тут и там в самом левом "икс" исходное значение сохраняется вплоть до последней операции, тогда как должно было измениться немедленно при (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


после этого углубляемся в спеку :
  1. Пусть lref будет результатом вычисления LeftHandSideExpression.
  2. Пусть lval будет GetValue(lref).
  3. Пусть rref будет результатом вычисления AssignmentExpression.
  4. Пусть rval будет GetValue(rref).
  5. Пусть r будет результатом применения оператора @ к lval и rval.
  6. Вызвать PutValue(lref, r) и вернуть r.

во втором примере (моём) берётся значение икса (3), далее вычисляется значение правой стороны ( тоже 3), потом честно применяется к ним минус, получаем нуль.

фишка в том, что X изменяется, но двиг уже взял его значение (старое), и не обновляет его (ящитаю)

т.е. в числах всё происходит так :
3 -  (9 -  (3 + 3)); // 3 - (6 - 3) -> 3 - 3.

Последний раз редактировалось melky, 20.10.2012 в 12:25.
Ответить с цитированием