Appel de la fonction principale 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() en utilisant g :
#include
#include
using namespace std;
int main() {
int y = rand() % 10; // returns 3, then 6, then 7
cout Une fois compilé et exécuté, ce code générera le résultat suivant :
y = 3
y = 6
y = 7
Analyse de l'assembly
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 $7, -12(%rbp)
je .L7
call main
...
.L7:
...
leave
ret
Remarque :
Bien que ce comportement soit 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3