«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Разрешен ли рекурсивный вызов `main()` в C++?

Разрешен ли рекурсивный вызов `main()` в C++?

Опубликовано 4 ноября 2024 г.
Просматривать:166

Is Recursively Calling `main()` Allowed in C  ?

Рекурсивный вызов основной функции в C.

В приведенном фрагменте кода предпринимаются попытки рекурсивного вызова функции main() внутри самой себя в C . Однако важно отметить, что такое поведение не допускается при строгом соответствии требованиям C.

Разрешен ли рекурсивный вызов main() в C?

Согласно стандарту C , функция не может вызывать сама себя напрямую, включая функцию main(). Это ограничение предназначено для предотвращения бесконечной рекурсии и гарантированного завершения программы.

Практическая реализация с помощью g

Несмотря на языковой стандарт, на практике можно вызывать main() рекурсивно с помощью компилятора GNU C (g). g не обеспечивает строгого соблюдения стандарта в этом отношении, позволяя компилировать и выполнять код с рекурсивными вызовами main().

Пример кода

Следующий измененный фрагмент кода демонстрирует рекурсивные вызовы main() с использованием g :

#include 
#include 
using namespace std;

int main() {
    int y = rand() % 10; // returns 3, then 6, then 7
    cout 

При компиляции и выполнении этот код сгенерирует следующий вывод:

y = 3
y = 6
y = 7

Анализ сборки

Исследование сборки, сгенерированной для этого кода, показывает, что g обрабатывает рекурсивные вызовы main() так же, как и любой другой вызов функции:

main:
        ...
        cmpl    $7, -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret

Примечание:

Хотя такое поведение возможно с g , важно отметить, что оно не гарантировано. Другие компиляторы могут строго придерживаться стандарта C, что приводит к ошибкам компиляции или неожиданному поведению. Поэтому использование рекурсивных вызовов main() не рекомендуется.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3