Неверный вывод области действия функции [закрыт]

0

Когда я запускаю этот код, я получаю ответ как 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--;
}
  • 3
    Сделайте отступ / формат вашего кода правильно, вы вернетесь в цикл, не может быть бесконечным вообще.
  • 1
    Существует только один num , и он определенно не входит в область действия только одной функции.
Показать ещё 4 комментария
Теги:
scope
function

3 ответа

1

Что произойдет с 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

То же самое для оператора ++.

  • 0
    Я знаю, что после printf ("% d", r ()); функция обновляет, а затем проверяет условие, как условие ложно, чтобы завершить цикл. это из-за возврата 0;
  • 0
    Существует ключевое слово continue чтобы начать следующий цикл, и клавиша break чтобы выйти из всех циклов.
0

Допустим, у нас есть это 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
0

Если вы правильно отделите свой код:

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. Уменьшение происходит после возвращения. (Ну, конечно, это не так: компилятор делает копию, уменьшает и возвращает копию.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню