nkorobkov
@nkorobkov

Почему a++ + ++a работает не так?

Похоже я что-то не так понял... насколько я знаю, ++a прибавляет единицу к переменной, и сразу возвращает измененное значение, a++ делает то же самое, только возвращает старое значение. Если это так, то почему следующий код возвращает 4, а не 3?
var a = 1;
alert(a++ + ++a); //возвращает 4


По идее, постфиксный оператор должен вернуть 1, затем прибавить к нему 2, в итоге должно получиться 3... Объясните пожалуйста, почему так?
  • Вопрос задан
  • 2947 просмотров
Решения вопроса 3
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
1. Выполняем a++ (a=2, вернулось 1)
2. Выполняем ++a (a=3, вернулось 3)
3. Выполняем вернулось_1 + вернулось_2 (а=3, вернулось 1+3=4)

Все вроде ок.
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Инкременты изменяют саму переменную, а не только возвращают значение на единицу больше. Поэтому, итоговое выражение выглядит так: (1 + 3).
Во второй половине выражения a уже равно двум и сразу ещё инкрементируется до трёх.
var a, b, c;
a = 1;   // a = 1, b = undefined, c = undefined
b = a++; // a = 2, b = 1, c = undefined
c = ++a; // a = 3, b = 1, c = 3
alert(b + c); // 1 + 3
Ответ написан
Комментировать
lxsmkv
@lxsmkv
Test automation engineer
я для себя запоминал так:
a++ изменяет значение при следующем исполъзовании, в то время как ++a - мгновенно.
т.о. (выражение читается слева направо), получаем:
1 + (тут мы используем переменную снова, значит оно стало 2, и мгновенно прибавляем к нему 1, значит второе слагаемое 3). Получаем в сумме 4.

Кстати в Java точно также (это я к тому что поведение может и не интуитивное, но в некой мере общепринятое)

P.S.: Забыл указать, для полноты картины, что, унарные операции имеют более высокий приоритет чем арифметические, (см. Приоритет операторов) поэтому мы сначала вычисляем значения слагаемых, и лишь потом производим сложение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
По идее, постфиксный оператор должен вернуть 1, затем прибавить к нему 2, в итоге должно получиться 3... Объясните пожалуйста, почему так?

не 2 а 3, когда вызывается префиксный оператор, а == 2, а не 1
Ответ написан
Комментировать
Ivanq
@Ivanq
Знаю php, js, html, css
Как это работает в JS:
a++ + ++a
1. a++ == 1 (a == 2)
2. ++a == 3 (a == 3)
3. 1 + 3 == 4 (a == 3)


Ваша ошибка здесь:
затем прибавить к нему 2

Затем прибавить к нему (a + 1 == 2) еще 1 (2 + 1 == 3) и прибавить к предыдущему результату (a++ == 1)

Кстати, никогда не делайте так. Это значит НИКОГДА. Может, это не UB в JavaScript, но это UB в C++ и т. д.

Может быть, не все браузеры работают именно так, как в примере. Да и когда переходишь на другой язык, часто продолжаешь использовать особенности старого.

Например, в C++ + - не sequence point. Грубо говоря, это значит, что если перед и после точки следования меняется одна переменная, результат не определен. Например, это может быть 4, как в JS (идем слева направо), это может быть 5 (идем справа налево):
a++ + ++a
1. ++a == 2 (a == 2)
2. a++ == 2 (a == 3)
3. 2 + 3 == 5 (a == 3)

...это может быть 3:
a++ + ++a
1. a++ == 1 (a == 1)
2. ++a == 2 (a == 1)
3. 1 + 2 == 3 (a == 1)
4. a++; ++a (a == 3)

И так далее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы