JavaScript

Почему цикл while не останавливается когда i=0 ?

 let i = 10  

while (i--){

console.log(i)

}
Подскажите почему цикл не останавливается когда i=0, проходит еще одна итерация и по завершению цикла получаем i = -1.
D.
Doktor ......
395
Потому что вся разница между --i и i-- префиксным и постфиксным декрементом, --i уменьшает значение переменной на единицу и возвращает это же новое значение, i-- уменьшает значение переменной на единицу, но возвращает старое значение до уменьшения.

Например i = 2; alert(--i); уменьшит значение и выведет 1, alert(i--) уменьшит значение, но выведет 2

Как это работает?

Представим что изначально i = 2;

Когда начинает выполняться цикл while, проверяется условие цикла на истинность или ложность, while(i--) выражение внутри while в скобках i-- уменьшает значение на единицу, но возвращает старое значение до уменьшения, то есть 2 и именно это значение используется для проверки истинности или ложности условия цикла, т.к. 2 отличается от 0, соответственно условие является истинным, и затем уже выполняется тело цикла, выводится значение 1 в консоль, потому что i было уменьшено в условии цикла while, затем вновь проверяется условие, т.к. i = 1, то i-- уменьшает значение и возвращает старое, то есть 1, т.к. 1 удовлетворяет истинности цикла, выполняется тело цикла, и уже в консоль выводится 0, затем еще раз проверяется условие цикла, на этот раз i = 0, i-- уменьшает переменную на единицу и возвращает старое значение, то есть 0 и т.к. 0 в логическом контексте является false цикл while прекращает свою работу, а интерпретатор начинает исполнять код идущий после while, после выполнения цикла переменная i уже равна -1.

Объяснение может показаться сложным на первый взгляд, но ничего сложного нету, главное знать разницу между операторами префиксного и постфиксного инкремента и декремента. Новички часто путают разницу между --i и i--, думая что они работают одинаково, по факту так оно и есть, но разница все же есть, а именно то как и где они используются.
Денис Тихонов
Денис Тихонов
4 039
Лучший ответ
У тебя i никогда не будет соответствовать условиям.
Иван Булдаков
Иван Булдаков
91 019
Потому что --i
Юрий Исаев
Юрий Исаев
30 157
Doktor ...... Интересует сам процес работі даного цикла почему так происходит
Юрий Исаев *постдекремента, но не суть
 let i = 1;   

while (i--){ // во время проверки i == 1
// сразу после проверки i уменьшается и теперь i == 0
console.log(i); // выводит 0
// при следующей проверке цикл останавливается, так как i == 0
}
console.log(i); // выводит -1, так как после проверки и остановки цикла срабатывает постдекремент
Andrei Gubert
Andrei Gubert
23 960
Наглядная разница префиксного и постфиксного декремента. Префиксный декремент уменьшает переменную до её использования в других выражениях, а постфиксный декремент, наоборот, уменьшает переменную только после того, как она будет использована в выражении.

Конкретно в данном случае использован постфиксный декремент, то есть значением выражения является значение переменной ДО уменьшения. Именно поэтому и образуется лишняя итерация, и получается значение -1 после выхода из цикла.
Game Play
Game Play
12 091
Doktor ...... но почему оно работает с переменной если она уже 0 ведь когда 0 цикл должен прерываться, а оно берет и 0 еще уменьшает на 1
Doktor ...... так надо ж разобраться почему так происходит
Вообще такое не должно работать по идее так как математические функции нельзя ставить в условие цикла. Однако, судя по комментариям, у остальных все запускается. Если так то у тебя проблема в том что ты не знаешь как используется декремент. Есть два варианта их использований, --i и i--. Разница в том что i-- использует а затем уменьшает, а --i сначала уменьшает а потом использует. Я совсем недавно разобрался с этим. Вбей в поиск ++i и i++ разница, разберешься, ничего сложного
Andrei Gubert В условии цикла можно вставить любое выражение. Переменные разве что нельзя объявлять. Не понятно откуда у вас такая идея.
Andrei Gubert Хоть функцию объявляй.