Почему так странно работает постинкремент ?
Имею опыт разработки на 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++ запоминает старое значение, инкрементирует переменную, возвращает старое значение |
Цитата:
Переменной присваивается значение другой переменной, после чего происходит постинкремент последней. |
Цитата:
|
Цитата:
В JS же будет следующее i=1; a=i; i=i+1; alert(a+', '+i); |
Цитата:
|
Цитата:
|
Цитата:
Если ты не веришь букваю... Не веришь своим глазам... Тебя остается только пожалеть. :( |
Цитата:
var a=0; var b=0; alert('Инкремент '+(++a)); alert('Постинкремент '+b++); alert('a='+a+', '+'b='+b); |
Цитата:
|
Цитата:
Префиксный увеличивает значение переменной до того как выражение получило фактическое значение переменной. Постфиксный после того как выражение получило фактическое значение переменой. Так исторически сложилось еще в древних ассемблерах операция INC или DEC регистра очень часто встречалась либо в начале блока либо в конце после этого проверка и переход в начало кода или выход из него (реализация обычного цикла). т.к. это было практически в любом цикле то для такого поведения в высоко уровненных языках придумали специальный коротки оператор. |
Цитата:
а старое значение запоминать надо, чтобы его вернуть. потому постикремент чуть медленнее (по крайней мере в С) и некоторые в циклах for по привычке пишут ++i более того, в плюсах можно для своих классов переопределять операторы, в том числе ++/-- https://ru.wikipedia.org/wiki/%D0%9F...80%D0%BE%D0%B2 и можно заметить, что постикремент делается именно как я написал, с копией старого значения |
Часовой пояс GMT +3, время: 00:44. |