Когда я запускаю этот код, я получаю ответ как 5, но я не понимаю, как это работает. В моем собственном понимании это должен быть бесконечный цикл, потому что значение числа никогда не изменится как его внутренняя часть области функций. Эта функция дает выход из 5, и цикл for работает только один раз, когда мне нужно понять, как условия здесь выполняются.
#include <stdio.h>
int num=7;
int r();
int main()
{
for(r();r();r())
{
printf("%d",r());
return 0;
}
}
int r()
{
return num--;
}
Что произойдет с num
во время выполнения?
num = 7;
r(); // first argument of for, init nothing → return 7, then num = 6
r(); // second argument of for → return 6, then num = 5
// third argument is done at the end of for, not now
printf("%d",r()); // execute r() → return 5, then num = 4, but print 5
return 0; // exit the current function or the process if it in the main function
Для информации:
num--; //возвращаем num, затем уменьшаем num --num; // уменьшаем число, затем возвращаем num
То же самое для оператора ++.
continue
чтобы начать следующий цикл, и клавиша break
чтобы выйти из всех циклов.
Допустим, у нас есть это for
цикла, где A
, B
, C
и D
являются допустимыми выражениями:
for (A; B; C)
{
D;
}
Это эквивалентно следующему в while
цикла:
A;
while (B)
{
D;
C;
}
Поскольку D
в вашем цикле является вызовом printf
за которым следует оператор return
, цикл будет выполняться только один раз (а C
не выполняется), а затем вернуться из main
функции, которая завершит выполнение программы.
А что касается того, почему вы печатаете 5
, это потому, что r
вызывается дважды, прежде чем вы вызовите printf
, уменьшив его с 7
до 5
.
Если вы развернете цикл, это будет похоже на
r(); // Initialization in 'for' loop
r(); // Condition in 'for' loop
printf(...);
return 0; // Terminates the program
Если вы правильно отделите свой код:
include <stdio.h>
int num = 7;
int r()
{
return num--;
}
int main()
{
for(r(); r(); r()) {
printf("%d", r());
return 0;
}
}
вы увидите, что он не может быть бесконечным циклом, потому что вы возвращаетесь из него после печати в первый раз.
Изменения локальных переменных не видны из-за внешней функции thze, но переменная num
является глобальной переменной. Как main
и r
- один и тот же экземпляр этой глобальной переменной.
Что касается того, почему ответ 5, переписать цикл, как эквивалент в while
цикла:
int main()
{
r(); /* init */
while (r()) { /* condition */
printf("%d", r());
return 0;
r(); /* update */
}
}
Функция r
возвращает исходное значение num
. Уменьшение происходит после возвращения. (Ну, конечно, это не так: компилятор делает копию, уменьшает и возвращает копию.)
num
, и он определенно не входит в область действия только одной функции.