Урок 69. Цикл for

   ⁄ 

 Обновлено 3 Июл 2017

  ⁄   

Безусловно, наиболее используемым циклом в C++ является for. Цикл for идеален, когда мы точно знаем, сколько итераций должно быть.

Выглядит он довольно просто:

for (объявление переменных; условие; инкремент/декремент счетчика)
    тело цикла;

Или, преобразуя for в эквивалентный цикл while:

{ // обратите внимание, цикл находится в блоке
    объявление переменных;
    while (условие)
    {
       тело цикла;
       инкремент/декремент счетчика;
    }
} // переменные, объявленные внутри цикла выходят из области видимости здесь

Переменные, определенные внутри цикла for, имеют специальный тип области видимостиобласть видимости цикла. Такие переменные существуют только внутри цикла и недоступны за его пределами.

Выполнение цикла for

Цикл for выполняется в три шага:

1. Выполняется первое выражение: объявление переменных. Как правило, здесь выполняется определение и инициализация счетчиков цикла, а точнее – одного счетчика цикла. Эта часть выполняется только один раз, когда цикл выполняется впервые.

2. Выполняется второе выражение: условие. Если условие равно false, цикл немедленно прекращается. Если равно true — выполняется тело цикла.

3. После выполнения тела цикла выполняется третье выражение: инкремент/декремент счетчика цикла. Переменная увеличивается или уменьшается на единицу. После этого цикл возвращается к шагу 2.

Рассмотрим пример цикла for и разберемся детальнее, как он работает:

Сначала мы объявляем переменную count и присваиваем ей значение 0.

Далее выполняется условие count < 10, а так как count равен 0, то условие 0 < 10 имеет значение true. Следовательно, выполняется тело цикла, в котором мы выводим в консоль переменную count (0).

Затем выполняется выражение ++count, т.е. инкремент переменной. Затем цикл снова возвращается к проверке условия.

Условие 1 < 10 имеет значение true, поэтому тело цикла выполняется снова. Выводится 1, а переменная count увеличивается уже к значению 2. Условие 2 < 10 — true, выводится 2, а count увеличивается к 3. И так далее.

В конце, count увеличивается к 10, а условие 10 < 10 — ложное, и цикл завершается.

Следовательно, результат программы:

0 1 2 3 4 5 6 7 8 9

Циклы for могут быть несколько трудными для начинающих программистов, однако опытные кодеры любят их, так как эти циклы очень компактны и удобны. Для наглядности, давайте преобразуем цикл for выше в эквивалентный цикл while:

Обратите внимание, внешние фигурные скобки здесь необходимы, так как переменная count выходит за пределы области видимости, когда цикл завершается.

Еще примеры циклов for

Давайте, используя цикл for, напишем функцию вычисления значений в степени n (exponent):

Функция возвращает значение base^exponent (число, поднесенное к степени n). Base – число, которое нужно возвести в степень, exponent – степень, в которую нужно возвести base.

Это простой цикл for, с отсчетом от 0 до (но исключая) значения экспонента.

Если экспонент равен 0, цикл for будет выполняться 0 раз, и функция вернет 1.

Если экспонент равен 1, цикл for будет выполняться 1 раз, и функция вернет 1 * base.

Если экспонент равен 2, цикл for будет выполняться 2 раза, и функция вернет 1 * base * base.

Хотя в большинстве циклов  используется инкремент счетчика, мы также можем использовать и декремент счетчика:

Результат:

8 7 6 5 4 3 2 1 0

Также мы можем увеличивать или уменьшать значение счетчика больше, чем на единицу с каждой итерацией:

Результат:

9 7 5 3 1

Ошибка неучтенной единицы

Одна из самых больших проблем, с которой приходится сталкиваться начинающим программистам в циклах for (а также и в других типах циклов) — это ошибка на единицу (или ошибка неучтенной единицы). Она возникает, когда цикл повторяется на 1 раз больше или на 1 раз меньше нужного количества итераций. Это обычно происходит из-за того, что в условии используется некорректный оператор сравнения (например, > вместо >=). Как правило, эти ошибки трудно отследить, так как компилятор не будет жаловаться на них — программа будет работать нормально, но её результаты будут неправильны.

При написании циклов for помните, что цикл будет выполняться до тех пор, пока условие будет true. Рекомендуется тестировать циклы, используя разные значения для проверки работоспособности цикла. Хорошая практика — проверять цикл с помощью известных вводов (чисел, символов и прочего), которые заставляют цикл выполниться 0, 1 и 2 раза. Если цикл работает справно с таким количеством итераций, то и будет правильно работать для любого другого количества итераций.

Правило: Тестируйте свои циклы, вводя известные значения, которые заставляют цикл выполниться 0, 1 и 2 раза.

Пропущенные выражения в цикле

Также в циклах можно пропускать одно или все сразу выражения. Например:

Результат:

0 1 2 3 4 5 6 7 8 9

Инициализацию счетчика мы прописали вне цикла, а инкремент счетчика внутри цикла. В самом операторе for мы указали только условие. Иногда бывают случаи, когда не требуется объявлять счетчик цикла (потому что у нас уже есть один) или увеличивать его (так как мы увеличиваем его каким-то другим способом).

Хоть это и не часто можно наблюдать, но в операторе for можно вообще ничего не указывать. Стоит отметить, что подобное приведет к бесконечному выполнению цикла:

for (;;)
    тело цикла;

Пример выше эквивалентен:

while (true)
    тело цикла;

Несколько объявлений переменных в цикле for

Хотя в циклах for обычно используется только один счетчик, иногда могут возникать ситуации, когда нужно будет работать с несколькими переменными. Для этого используется оператор Запятая для присваивания (в объявлении переменных) или изменения (в инкременте/декременте переменных) значений нескольких переменных:

Этот цикл присваивает значения двум ранее объявленным переменным: aaa (0) и bbb (9). Только с каждой итерацией aaa увеличивается на единицу, а bbb уменьшается на единицу.

Результат выполнения этой программы:

0 9
1 8
2 7
3 6
4 5
5 4
6 3
7 2
8 1
9 0

Примечание: Цикл выше можно переписать как:

В этом случае запятая в объявлении переменных является частью синтаксиса, а не использованием оператора Запятая. Но эффект идентичен.

Использование циклов for в старом коде

В старых версиях C++ переменные, объявленные в операторе for, не уничтожались в конце цикла. Т.е. у вас могло быть что-то вроде этого:

Позднее, это было запрещено, но вы все еще можете увидеть подобное в старом коде.

Вложенные циклы for

Подобно другим типам циклов, циклы for могут быть вложены в другие циклы. В следующем примере мы разместили один for внутри другого for:

С каждой итерацией внешнего цикла внутренний цикл выполняется полностью. Следовательно, результат:

a012
b012
c012
d012
e012

Итого

Циклы for — наиболее часто используемые циклы в языке C++. Несмотря на то, что их синтаксис, как правило, немного запутывает начинающих программистов, вы очень скоро к ним привыкните и сами начнете использовать!

Тест

1. Напишите цикл for, который выводит каждое четное число от 0 до 20.

2. Напишите функцию sumTo(), которая принимает целочисленный параметр с именем value и возвращает сумму всех чисел от 1 до значения value.

Например, если значение value – 5, то sumTo(5) должен вернуть 15, что равно 1 + 2 + 3 + 4 + 5.

Подсказка: Используйте переменную вне цикла для хранения суммы, как в примере с функцией pow в подзаголовке «Еще примеры циклов for».

3. Что не так со следующим циклом?

Ответы

Ответ 1

Ответ 2

Ответ 3

Этот цикл for выполняется до тех пор, пока count >= 0. Другими словами, он работает до тех пор, пока переменная count не станет отрицательным числом. Однако, поскольку count типа unsigned, то эта переменная никогда не сможет быть отрицательной. Следовательно, этот цикл бесконечный! Как правило, рекомендуется избегать использования типов unsigned в цикле, если на то нет крайней необходимости.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *