C ++: двойной вызов main () приводит к бесконечной рекурсии l oop - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующий код C ++

#include <iostream>
using namespace std;

int main()
{
    static int v = 5;
    cout<<v;
    v--;
    if(v)
    {
        main();
        main();
    }
}

Если я вызываю main только один раз, когда код ведет себя правильно и выдает вывод 54321, но если я скомпилирую вышеупомянутую программу, она дает бесконечное l oop и тогда происходит ошибка сегментации. Может кто-нибудь объяснить, пожалуйста?

1 Ответ

2 голосов
/ 28 апреля 2020

В операторе if любое значение , отличное от нуля , оценивается как истинное.

При первом вызове будет выполняться рекурсивный l oop, начиная с v=5, уменьшая v до 4 перед первым if, а затем продолжая уменьшать v на каждой итерации, пока v не станет 0, ломая l oop.

Второй вызов будет запустить новую рекурсивную l oop, начиная с v=0, уменьшая v до -1 перед первой if, а затем продолжая уменьшать v на каждой итерации, пока v не переполнится и в конечном итоге снова становится 0, ломая l oop.

Если он даже далеко, так как каждый вызов main() рекурсивно толкает данные в стек вызовов, пока не останется больше места в стеке имеется.

...