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>
Une fois compilé et exécuté, ce code générera le résultat suivant :
y = 3 y = 6 y = 7
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
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!