Main() peut-il être appelé de manière récursive en C ?
L'extrait de code ci-dessous démontre le comportement curieux de l'appel de main() de manière récursive en C .
<code class="cpp">#include <iostream> #include <cstdlib> int main() { std::cout << "!!!Hello World!!!" << std::endl; system("pause"); return main(); }</code>
Le code se compile avec succès et une fois exécuté, il affiche "Hello World !!!" indéfiniment. Cependant, il est important de noter que ce comportement n’est pas conforme aux normes en C . Le standard C interdit explicitement d'appeler main() de manière récursive ou de prendre son adresse.
En pratique, cependant, certains compilateurs, comme le compilateur Linux g, autorisent l'appel de main() dans main(). Cette permissivité est évidente dans le code suivant :
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
Lorsqu'il est exécuté, ce code génère une série de valeurs "y" (par exemple, 3, 6, 7), chacune à partir d'un appel ultérieur à main() .
L'analyse de l'assembly compilé révèle que main() est appelée comme n'importe quelle autre fonction :
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
Malgré le Interdiction du Standard, g semble tolérer de tels appels. Cependant, ce comportement n'est pas garanti et les programmeurs doivent éviter de s'y fier pour garantir la portabilité et la conformité à la norme C.
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!