Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpPmLpNc 140 of 390 menu
◀ ▶

Префикс и постфикс в циклах в C++

Счетчик цикла увеличивают двумя записями. В префиксном варианте знак стоит перед именем: ++i. В постфиксном варианте знак стоит после имени: i++. Выведем числа от 0 до 2 обоими способами:

for (int i = 0; i < 3; ++i) { std::cout << i << "\n"; // выведет 0, 1 и 2 }
for (int i = 0; i < 3; i++) { std::cout << i << "\n"; // выведет 0, 1 и 2 }

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

Разница появляется, когда значение сразу читают. Префиксный вариант сначала увеличивает число и отдает уже новое значение. Постфиксный вариант отдает еще старое число, а увеличивает его потом.

Для числа отдельной копии нет: старое значение и есть само число. У итератора, объекта, который перебирает набор, постфиксный вариант хранит копию прежней позиции, а префиксный только сдвигает ее. В этом учебнике в шаге цикла пишут префиксный вариант. Постфиксный вариант тоже обычен, особенно в коде в стиле C. Декремент устроен так же.

Покажем разницу в цикле while. Префиксный вариант печатает уже увеличенное число. Цикл идет, пока num меньше 3, поэтому на экран попадают 1, 2 и 3:

int num = 0; while (num < 3) { std::cout << ++num << "\n"; // выведет 1, 2 и 3 }

Постфиксный вариант печатает число до увеличения. Первый проход выводит 0, и только затем num становится 1. Последний проход выводит 2, после этого num равен 3, и условие уже ложно:

int num = 0; while (num < 3) { std::cout << num++ << "\n"; // выведет 0, 1 и 2 }

Не запуская код, определите, что выведется на экран:

for (int i = 1; i <= 4; ++i) { std::cout << i << "\n"; }

Не запуская код, определите, что выведется на экран:

int num = 0; while (num < 2) { std::cout << ++num << "\n"; }

Не запуская код, определите, что выведется на экран:

int num = 0; while (num < 2) { std::cout << num++ << "\n"; }
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить