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

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

Barbara Streisand
Libérer: 2024-11-02 19:23:02
original
298 Les gens l'ont consulté

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

Appel de la fonction Main de manière récursive en C

L'extrait de code fourni tente d'appeler la fonction main() de manière récursive en elle-même en C . Cependant, il est important de noter que ce comportement n'est pas autorisé en stricte conformité avec C.

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

Selon la norme C , une fonction ne peut pas s'appeler directement, y compris la fonction main(). Cette restriction est destinée à empêcher une récursion infinie et à garantir l'arrêt du programme.

Implémentation pratique avec g

Malgré le standard du langage, il est possible d'appeler main() de manière récursive en pratique en utilisant le compilateur GNU C (g ). g n'applique pas strictement la norme à cet égard, permettant au code avec des appels récursifs main() de se compiler et de s'exécuter.

Exemple de code

L'extrait de code modifié suivant démontre les appels récursifs main() à l'aide de g :

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

int main() {
    int y = rand() % 10; // returns 3, then 6, then 7
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>
Copier après la connexion

Une fois compilé et exécuté, ce code générera le résultat suivant :

y = 3
y = 6
y = 7
Copier après la connexion

Analyse d'assemblage

L'examen de l'assembly généré pour ce code révèle que g traite les appels main() récursifs comme n'importe quel autre appel de fonction :

main:
        ...
        cmpl    , -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret
Copier après la connexion

Remarque :

While ce comportement est possible avec g , il est crucial de noter qu'il n'est pas garanti. D'autres compilateurs peuvent adhérer strictement à la norme C, ce qui entraîne des erreurs de compilation ou un comportement inattendu. Par conséquent, l’utilisation d’appels main() récursifs n’est pas une pratique recommandée.

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