Ответ 1
Из стандарта EcmaScript:
11.4.4 Оператор приращения префикса
Вывод UnaryExpression: ++ UnaryExpression оценивается следующим образом:
- Пусть expr является результатом вычисления UnaryExpression.
- Выбросить исключение SyntaxError, если все условия верны:
- Тип (expr) имеет значение Reference is true
- IsStrictReference (expr) истинно
- Тип (GetBase (expr)) - это запись среды.
- GetReferencedName (expr) является либо "eval", либо "arguments"
- Пусть oldValue будет ToNumber (GetValue (expr)).
- Пусть newValue является результатом добавления значения от 1 до oldValue, используя те же правила, что и для оператора + (см. 11.6.3).
- Вызов PutValue (expr, newValue).
- Возвращает newValue.
и
11.13.2 Назначение соединения (op =)
Производственное присвоение Выражение: LeftHandSideExpression AssignmentOperator AssignmentExpression, где AssignmentOperator является @= и @представляет один из операторов, указанных выше, оценивается следующим образом:
- Пусть lref является результатом оценки LeftHandSideExpression.
- Пусть lval - GetValue (lref).
- Пусть rref является результатом вычисления AssignmentExpression.
- Пусть rval - GetValue (rref).
- Пусть r - результат применения оператора @к lval и rval.
- Выбросить исключение SyntaxError, если все условия верны:
- Тип (lref) имеет значение true.
- IsStrictReference (lref) истинно
- Тип (GetBase (lref)) - это запись среды.
- GetReferencedName (lref) является либо "eval", либо "arguments"
- Вызов PutValue (lref, r)
Таким образом, var i = 0; i += ++i
:
i = 0;
lvalue = value(i), which is 0;
rvalue = value(++i), which is: increment i, then value of i (1);
thus, rvalue = 1;
i = lvalue (0) + rvalue (1), which is 1.
Полностью соответствует спецификации.
Однако в С++ это определенно определяется как поведение undefined, поэтому на другом компиляторе вы также можете получить 1. Или 99. Или это может привести к выходу компьютера из строя. Все они будут стандартными компиляторами. Таким образом, большинство людей будут рекомендовать вам использовать переменную pre/post-incremented только в инструкции.