Префикс и постфикс в циклах в 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";
}