Maison >développement back-end >C++ >L'appel récursif de « main() » en C est-il autorisé ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 07:03:01645parcourir

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>

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>

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>

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!

Déclaration:
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