вернуться к уроку

Какие значения выведет цикл while?

важность: 4

Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.

Оба цикла выводят alert с одинаковыми значениями или нет?

  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, а потом уже произойдёт сравнение и выполнение alert.

    Далее 2, 3, 4… Значения выводятся одно за другим. Для каждого значения сначала происходит увеличение, а потом – сравнение, так как ++ стоит перед переменной.

    При i = 4 произойдёт увеличение i до 5, а потом сравнение while (5 < 5) – это неверно. Поэтому на этом цикл остановится, и значение 5 выведено не будет.

  2. От 1 до 5

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

    Первое значение: i = 1. Остановимся на нём подробнее. Оператор i++ увеличивает i, возвращая старое значение, так что в сравнении i++ < 5 будет участвовать i = 0 (в отличие от ++i < 5).

    Но последующий вызов alert уже не относится к этому выражению, так что получит новый i = 1.

    Далее следуют 2, 3, 4….

    Остановимся на i = 4. Префиксная форма ++i увеличила бы i и использовала бы в сравнении 5. Но здесь мы имеем постфиксную форму i++, поэтому она увеличивает i до 5, но возвращает старое значение. Таким образом, сравнение фактически равно while (4 < 5)true, поэтому срабатывает alert.

    Значение i = 5 – последнее, так как на следующем шаге while (5 < 5)false.