Kann main() in C rekursiv aufgerufen werden?
Der folgende Codeausschnitt zeigt das merkwürdige Verhalten des rekursiven Aufrufs von main() in C .
<code class="cpp">#include <iostream> #include <cstdlib> int main() { std::cout << "!!!Hello World!!!" << std::endl; system("pause"); return main(); }</code>
Der Code wurde erfolgreich kompiliert und zeigt bei der Ausführung „Hello World!!!“ an. unbegrenzt. Es ist jedoch wichtig zu beachten, dass dieses Verhalten in C nicht standardkonform ist. Der C-Standard verbietet ausdrücklich den rekursiven Aufruf von main() oder die Übernahme seiner Adresse.
In der Praxis erlauben jedoch einige Compiler, wie zum Beispiel der Linux-g-Compiler, den Aufruf von main() in main(). Diese Freizügigkeit wird im folgenden Code deutlich:
<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>
Bei der Ausführung generiert dieser Code eine Reihe von „y“-Werten (z. B. 3, 6, 7), jeweils aus einem nachfolgenden Aufruf von main() .
Die Analyse der kompilierten Assembly zeigt, dass main() wie jede andere Funktion aufgerufen wird:
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
Trotz der Das Verbot von Standard, g scheint solche Aufrufe zu tolerieren. Dieses Verhalten ist jedoch nicht garantiert und Programmierer sollten sich nicht darauf verlassen, um die Portabilität und die Einhaltung des C-Standards sicherzustellen.
Das obige ist der detaillierte Inhalt vonIst der rekursive Aufruf von „main()' in C zulässig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!