Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему так странно работает постинкремент ? (https://javascript.ru/forum/misc/76127-pochemu-tak-stranno-rabotaet-postinkrement.html)

hoz 07.12.2018 14:18

Почему так странно работает постинкремент ?
 
Имею опыт разработки на Java. Перешёл вот несколько дней назад на JS (изучаю ещё). Читаю учебник. Читаю запоем, что бы не пропустить какие-то нюансы. На один из них я наткнулся сегодня:
Читаю здесь
Есть 2 момента:
1.
var i = 1;
var a = ++i; // (*)

alert(a); // 2

Здесь всё понятно и логично.
2.
var i = 1;
var a = i++; // (*)

alert(a); // 1

Это не логично и не понятно вообще.
Потому что есть строка:
var a = i++; // (*)

Здесь порядок исполнения операторов и соот-но кода будет следующий:
  • i++
  • a = "то что получилось в результате выполнения предыдущей операции, а это 2"
Потом у нас есть ;, который обозначает, что инструкция выполнена и появился переход к следующей инструкции. Уже должно было бы значение a измениться и стать 2. Но этого не происходит.
Хотя, в любом другом языке было бы проще. Вернётся после выполнения так сказать строки тоже самое. Разница лишь в том, что выведет переменная с пост(пре)инкрементов в момент этой операции. Но не иначе.
Кто-нить это вообще понимает мне интересно? Или это костыль?

Alexandroppolus 07.12.2018 14:43

я не понимаю в чем затруднение
++ работает точно так же как и в старом добром С, откуда он и взят

i++ запоминает старое значение, инкрементирует переменную, возвращает старое значение

ksa 07.12.2018 15:09

Цитата:

Сообщение от hoz
Это не логично и не понятно вообще.

Все как раз логично и понятно...
Переменной присваивается значение другой переменной, после чего происходит постинкремент последней.

ksa 07.12.2018 15:10

Цитата:

Сообщение от Alexandroppolus
i++ запоминает старое значение

Странная формулировка... Постикремент "запоминает" уже инкрементное значение.

ksa 07.12.2018 15:12

Цитата:

Сообщение от hoz
Здесь порядок исполнения операторов и соот-но кода будет следующий:
i++
a = "то что получилось в результате выполнения предыдущей операции, а это 2"

Этот порядок исполнения только в твоей голове...
В JS же будет следующее

i=1;
a=i;
i=i+1;
alert(a+', '+i);

hoz 07.12.2018 15:13

Цитата:

Сообщение от ksa (Сообщение 500002)
Все как раз логично и понятно...
Переменной присваивается значение другой переменной, после чего происходит постинкремент последней.

У "=" приоритет самый почти низкий, кроме "+" и "-". Каким боком сразу присвоится тогда?

ksa 07.12.2018 15:14

Цитата:

Сообщение от hoz
Хотя, в любом другом языке было бы проще.

Во всех ЯП постинкремент работает одинаково. Иначе нет никакой разницы с инкрементом... :D

ksa 07.12.2018 15:16

Цитата:

Сообщение от hoz
Каким боком сразу присвоится тогда?

Это все работает "по определению" постинкремента.

Если ты не веришь букваю... Не веришь своим глазам...
Тебя остается только пожалеть. :(

ksa 07.12.2018 15:27

Цитата:

Сообщение от hoz
Здесь порядок исполнения операторов и соот-но кода будет следующий:
i++
a = "то что получилось в результате выполнения предыдущей операции, а это 2"

Так еще покажу разницу инкремента и постинкремента...

var a=0;
var b=0;
alert('Инкремент '+(++a));
alert('Постинкремент '+b++);
alert('a='+a+', '+'b='+b);

laimas 07.12.2018 15:37

Цитата:

Сообщение от ksa
покажу разницу инкремента и постинкремента

И второе тоже инкремент - первый префиксный, а второй постпрефиксный :)


Часовой пояс GMT +3, время: 16:01.