2016-02-15 3 views
-2

Это мой пример кода:Почему цикл не работает бесконечно в приведенном ниже примере?

int main() 
{ 
    static int i = 5; 
    if(--i) 
    { 
     main(); 
     printf("%d ",i); 
    } 
} 

Почему печать 0 0 0 0? И почему цикл не бесконечен? Этот вопрос взят от geeksforgeeks.

+3

удалить ключевое слово 'static'. – Himanshu

+0

Также удаление статического элемента вызовет 'StackOverflowException'. – AntiHeadshot

+1

Вы никогда не должны вызывать main() рекурсивно, это крайне плохая практика. В общем, рекурсии следует избегать, когда это возможно. – Lundin

ответ

3

Ваш if(--i) получает по if(0), и это оценивается в false и существует программа. Статические переменные не повторно инициализируются после того, как они были объявлены. Как отметил @Himanshu, удаление статического ключевого слова приведет к бесконечному циклу, потому что i всегда будет иметь значение, равное 5.

Оставив программу как есть, ваш i уменьшится до 0 и остановит цикл. Функция main() просто вызывает себя и когда i == 0, она останавливается от рекурсии и печатает стек.

+1

Программа не выходит, когда 'i' достигает' 0'. Вместо этого 'main' возвращается без рекурсивного вызова. Результат совсем другой. –

+0

@TomKarzes, я имел в виду: он просто называет себя, а когда 'i == 0', он останавливается от рекурсии и печатает стек. –

+0

Возможно, но это не то, что вы сказали. Вопросы формулировки. –

4

main будет называться сам по себе 4 раза, при этом i будет неоднократно уменьшаться. Так как i - static, то все i используется для всех вызовов main.

Ничего не выводится на консоль до тех пор, пока рекурсия не будет заблокирована. К тому времени i равен нулю.

Кстати, поведение на вызове mainне определено в C++, хотя в C разрешено. Убедитесь, что вы переключили флаг компилятора на C, если вы используете компилятор C++.

+0

'main()' сам вызов не определен в C++. Стандарт C++ требует, чтобы его имя никоим образом не использовалось в программе (например, вызывало его, принимая его адрес и т. Д.). – Peter

0

Статические переменные создаются в сегменте данных во время компиляции. В то время как во время выполнения один и тот же экземпляр статической переменной (которая была создана в сегменте данных) обновляется вместо создания переменной i снова и снова в сегменте стека при каждом рекурсивном вызове.

поэтому, когда функция возвращает main(), ту же переменную i, созданную на сегменте данных, ссылается на printf() оператор, который был уже уменьшен до 0, из-за предыдущих операций.

Теперь, переходя к второму вопросу, если (0) оценивается как ложное условие там, цикл завершается только там.

Смежные вопросы