Яке значення виведе цикл "while"?
Запишіть для кожного циклу значення, які він виведе. Потім порівняйте з відповіддю.
Чи виводять обидва цикли однакові значення?
-
Префіксна форма ++i:
let i = 0; while (++i < 5) alert( i ); -
Постфіксна форма i++
let i = 0; while (i++ < 5) alert( i );
Завдання демонструє, як префіксна/постфіксна форма можуть призвести до різних результатів при їх порівнянні.
-
Перший цикл виведе числа від 1 до 4
let i = 0; while (++i < 5) alert( i );Перше значення i = 1, тому що операція ++i спочатку збільшує i, і після цього повертає нове значення. Відповідно, перше порівняння буде 1 < 5 і alert виведе 1.
Далі йдуть 2, 3, 4… – значення показуються одне за одним. Порівняння завжди відбувається зі збільшеним значенням, тому що ++ стоїть перед змінною.
Наприкінці, коли i = 4 збільшується до 5, умова while(5 < 5) не справджується, і в результаті цикл зупиняється. Отже, 5 не покажеться.
-
Другий цикл виведе числа від 1 до 5
let i = 0; while (i++ < 5) alert( i );Перше значення знову i = 1. Постфіксна форма i++ збільшує i до 1 і повертає старе значення, тому порівняння i++ < 5 буде виконуватися з i = 0 (на противагу ++i < 5).
Далі йде виклик alert. Однак, це вже інший вираз, який виконується після збільшення i та порівняння. Тому він отримає поточне значення i = 1.
Далі слідують 2, 3, 4….
Зупинимося на i = 4. Префіксна форма ++i збільшила б i до 5 і використала це значення в порівнянні. Проте ми маємо постфіксну форму i++. Отже, вона збільшить i до 5, але поверне старе значення. Таким чином порівняння буде while(4 < 5) – що вірно, а тому відбудеться виклик alert.
Значення i = 5 буде останнім, тому що наступний крок вже буде while(5 < 5) – що не вірно.