Maison > développement back-end > C++ > le corps du texte

L'appel récursif de « main() » en C est-il autorisé ?

Linda Hamilton
Libérer: 2024-11-01 07:03:01
original
583 Les gens l'ont consulté

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

Main() peut-il être appelé de manière récursive en C ?

L'extrait de code ci-dessous démontre le comportement curieux de l'appel de main() de manière récursive en C .

<code class="cpp">#include <iostream>
#include <cstdlib>

int main() {
    std::cout << "!!!Hello World!!!" << std::endl;
    system("pause");
    return main();
}</code>
Copier après la connexion

Le code se compile avec succès et une fois exécuté, il affiche "Hello World !!!" indéfiniment. Cependant, il est important de noter que ce comportement n’est pas conforme aux normes en C . Le standard C interdit explicitement d'appeler main() de manière récursive ou de prendre son adresse.

En pratique, cependant, certains compilateurs, comme le compilateur Linux g, autorisent l'appel de main() dans main(). Cette permissivité est évidente dans le code suivant :

<code class="cpp">#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
    int y = rand() % 10;
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>
Copier après la connexion

Lorsqu'il est exécuté, ce code génère une série de valeurs "y" (par exemple, 3, 6, 7), chacune à partir d'un appel ultérieur à main() .

L'analyse de l'assembly compilé révèle que main() est appelée comme n'importe quelle autre fonction :

<code class="assembly">main:
...
cmpl    , -12(%rbp)
je      .L7
call    main
...
.L7:
...
leave
ret</code>
Copier après la connexion

Malgré le Interdiction du Standard, g semble tolérer de tels appels. Cependant, ce comportement n'est pas garanti et les programmeurs doivent éviter de s'y fier pour garantir la portabilité et la conformité à la norme C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!