Maison >développement back-end >C++ >Pouvez-vous appeler main() de manière récursive en C ?

Pouvez-vous appeler main() de manière récursive en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 20:45:02377parcourir

Can You Call main() Recursively in C  ?

Appeler main() en lui-même en C

La norme C décrit la fonction principale comme le point d'entrée fondamental de chaque programme. Cependant, la question se pose : "Est-il possible d'appeler main() depuis l'intérieur de lui-même ?"

Contraintes fonctionnelles

Selon le standard C, non. La fonction principale, une fois définie et exécutée, marque le début et la fin du programme. L'appel récursif de main() viole ce principe fondamental.

Implémentation pratique

En pratique, cependant, certains compilateurs comme g de Linux permettent l'appel non conventionnel de main() dans main(). Ce comportement n'est pas explicitement pris en charge par la norme mais est autorisé par l'implémentation du compilateur.

Par exemple, considérons le code suivant :

<code class="c++">#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int y = rand() % 10; // random number generation
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>

Ce code effectue une génération de nombres aléatoires, et si le Le nombre généré n'est pas égal à 7, il appelle récursivement main().

Analyse au niveau de l'assemblage

L'examen du code assembleur généré par g révèle que main() est invoqué comme n'importe quelle autre fonction :

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

Avertissement du compilateur

Il convient de noter que pendant que g compile un tel code, il génère un avertissement avec l'indicateur -pedantic pour vous rappeler qu'il viole la norme C :

g.cpp:8: error: ISO C++ forbids taking address of function '::main'

Conclusion

Bien que l'appel de main() en lui-même puisse fonctionner dans certaines situations, il n'est pas officiellement sanctionné par la norme C. Il s'agit d'une violation du comportement standard et peut conduire à des résultats indéfinis sur différents compilateurs et plates-formes. En tant que tel, il est fortement déconseillé de s'appuyer sur cette pratique non conventionnelle dans le code de production.

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