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
Libérer: 2024-11-02 20:45:02
original
356 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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'
Copier après la connexion

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!

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