Csklassami
@Csklassami

Почему цикл for не уменьшает значение в префиксной форме?

Почему такой цикл for(int i = f; i > 0; --i) не уменьшает значение i до 1 прохода цикла, хотя стоит в префиксной форме?

Декрементирование срабатывает только после прохода цикла 1 раз.
P.S. задача была про факториал, решил ее так for(int i = (f-1); i > 0; i--), но мне все равно интересно - предыдущий вариант тоже должен был работать
  • Вопрос задан
  • 3212 просмотров
Решения вопроса 1
EXL
@EXL
Энтузиаст
1. В цикле for нету разницы между постфиксной или префиксной формы декремента/инкремента для переменной-счетчика.

2. Первый проход цикла осуществляется с начальным значением i. Потом переменная-счетчик изменяется и второй проход цикла уже будет со значением i1 и т.д.

3. В вашем случае всё было сделано правильно:

exl@exl-Lenovo-G560e:~/SandBox > cat test.cpp 
#include <iostream>

int main() {
    int f = 15;
    for(int i = --f; i > 0; --i)
        std::cout << i << " ";
    std::cout << std::endl;
    return 0;
}

exl@exl-Lenovo-G560e:~/SandBox > g++ test.cpp
exl@exl-Lenovo-G560e:~/SandBox > ./a.out 
14 13 12 11 10 9 8 7 6 5 4 3 2 1


Заметьте, что для значения, которым мы будем инициализировать переменную-счетчик, разница в декременте/инкременте есть:

exl@exl-Lenovo-G560e:~/SandBox > cat test.cpp 
#include <iostream>

int main() {
    int f = 15;
    for(int i = f--; i > 0; --i)
        std::cout << i << " ";
    std::cout << std::endl;
    return 0;
}
exl@exl-Lenovo-G560e:~/SandBox > g++ test.cpp 
exl@exl-Lenovo-G560e:~/SandBox > ./a.out 
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Vampiro
любой операнд, который вы поставите третьим аргументом будет выполнен в самом конце прохождения цикла.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
for(int i = f; i > 0; --i)обычно раскрывается компилятором в
{
    int i = f;
    goto loop_cond;
loop:
    // тело цикла
    --i;
loop_cond:
    if (!(i > 0)) goto loop;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы