Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Циклы for и for each
Операторы циклов позволяют выполнить одни и те же инструкции многократно. Предположим, нужно вывести все числа от 1
до 100
по одному на строке. Обычным способом пришлось бы писать 100 строк кода:
std::cout << 1 << std::endl;
std::cout << 2 << std::endl;
// ...
std::cout << 100 << std::endl;
С помощью циклов то же действие можно выполнить одной строкой кода:
for (int i = 1; i <= 100; ++i) std::cout << i << std::endl;
Цикл for
Цикл for
используется для выполнения выражений определенное число раз. Цикл имеет следующий формат:
for (<Начальное значение>; <Условие>; <Приращение>) {
<Инструкции>
}
Параметры имеют следующие значения:
<Начальное значение>
— присваивает переменной-счетчику начальное значение;<Условие>
— содержит логическое выражение. Пока логическое выражение возвращает значениеtrue
, выполняются инструкции внутри цикла;<Приращение>
— задает изменение переменной-счетчика на каждой итерации.
Последовательность работы цикла for
:
- Переменной-счетчику присваивается начальное значение.
- Проверяется условие, если оно истинно, выполняются инструкции внутри цикла, а в противном случае выполнение цикла завершается.
- Переменная-счетчик изменяется на величину, указанную в
<Приращение>
. - Переход к п. 2.
Переменная-счетчик может быть объявлена как вне цикла for
, так и в параметре <Начальное значение>
. Если переменная объявлена в параметре, то она будет видна только внутри цикла. Кроме того, допускается объявить переменную вне цикла и сразу присвоить ей начальное значение. В этом случае параметр <Начальное значение>
можно оставить пустым. Пример:
int i; // Объявление вне цикла
for (i = 1; i <= 20; ++i) {
std::cout << i << std::endl;
}
// Переменная i видна вне цикла
std::cout << i << std::endl; // 21
// Объявление внутри цикла
for (int j = 1; j <= 20; ++j) {
std::cout << j << std::endl;
}
// Переменная j НЕ видна вне цикла
int k = 1; // Инициализация вне цикла
for ( ; k <= 20; ++k) {
std::cout << k << std::endl;
}
Цикл выполняется до тех пор, пока <Условие>
не вернет false
. Если это не произойдет, то цикл будет бесконечным. Логическое выражение, указанное в параметре <Условие>
, вычисляется на каждой итерации. Поэтому, если внутри логического выражения производятся какие-либо вычисления и значение не изменяется внутри цикла, то вычисление следует вынести в параметр <Начальное значение>
. В этом случае вычисление указывается после присваивания значения переменной-счетчику через запятую. Пример:
for (int i = 1, j = 10 + 30; i <= j; ++i) {
std::cout << i << std::endl;
}
Выражение, указанное в параметре <Приращение>
, может не только увеличивать значение переменной-счетчика, но и уменьшать его. Кроме того, значение может изменяться на любую величину. Пример:
// Выводим числа от 100 до 1
for (int i = 100; i > 0; --i) {
std::cout << i << std::endl;
}
// Выводим четные числа от 1 до 100
for (int j = 2; j <= 100; j += 2) {
std::cout << j << std::endl;
}
Если переменная-счетчик изменяется внутри цикла, то выражение в параметре <Приращение>
можно вообще не указывать:
for (int i = 1; i <= 10; ) {
std::cout << i << std::endl;
++i; // Приращение
}
Все параметры цикла for
и инструкции внутри цикла являются необязательными. Хотя параметры можно не указывать, точки с запятой обязательно должны быть. Если все параметры не указаны, то цикл окажется бесконечным. Чтобы выйти из бесконечного цикла следует использовать оператор break
. Пример:
int i = 1; // <Начальное значение>
for ( ; ; ) { // Бесконечный цикл
if (i <= 10) { // <Условие>
std::cout << i << std::endl;
++i; // <Приращение>
}
else {
break; // Выходим из цикла
}
}
Цикл for each
В языке C++ существует еще один вариант цикла for
, который позволяет перебирать элементы массива или контейнера. Формат цикла for each
:
for (<Объявление переменной> : <Массив или контейнер>) {
<Инструкции>
}
Пример вывода всех элементов массива с помощью цикла for each
:
int arr[] = {10, 20, 30}; // Массив
for (int element : arr) { // Получаем копию элемента
std::cout << element << std::endl;
}
На каждой итерации цикла переменной element
присваивается копия текущего элемента массива arr
. Цикл завершится, когда будут перебраны все элементы массива. Чтобы иметь возможность изменять элементы массива внутри цикла, а также для ускорения работы цикла следует объявлять переменную как ссылку, добавив перед именем переменной оператор &
. Умножим каждый элемент массива на 2
, а затем выведем все элементы в окно консоли:
int arr[] = {10, 20, 30}; // Массив
for (int &element : arr) { // Получаем ссылку на элемент, а не копию
element *= 2;
}
for (int &element : arr) {
std::cout << element << ' ';
} // 20 40 60
С помощью цикла for each
можно перебирать элементы контейнеров, например, выведем в окно консоли все элементы динамического массива, реализуемого классом vector
:
// #include <vector>
std::vector<int> arr = {10, 20, 30};
for (int &element : arr) {
std::cout << element << ' ';
} // 10 20 30
Вместо конкретного типа данных удобно указать ключевое слово auto
:
std::vector<int> arr = {10, 20, 30};
for (auto &element : arr) {
std::cout << element << ' ';
} // 10 20 30
Реквизиты
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов