назад до уроку

Яке значення виведе цикл "while"?

важливість: 4

Запишіть для кожного циклу значення, які він виведе. Потім порівняйте з відповіддю.

Чи виводять обидва цикли однакові значення?

  1. Префіксна форма ++i:

    let i = 0;
    while (++i < 5) alert( i );
  2. Постфіксна форма i++

    let i = 0;
    while (i++ < 5) alert( i );

Завдання демонструє, як префіксна/постфіксна форма можуть призвести до різних результатів при їх порівнянні.

  1. Перший цикл виведе числа від 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 не покажеться.

  2. Другий цикл виведе числа від 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) – що не вірно.