Heim > Backend-Entwicklung > C++ > Ist der rekursive Aufruf von „main()' in C zulässig?

Ist der rekursive Aufruf von „main()' in C zulässig?

Linda Hamilton
Freigeben: 2024-11-01 07:03:01
Original
711 Leute haben es durchsucht

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

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage