„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Ist der rekursive Aufruf von „main()“ in C++ erlaubt?

Ist der rekursive Aufruf von „main()“ in C++ erlaubt?

Veröffentlicht am 04.11.2024
Durchsuche:268

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

Rekursiver Aufruf der Hauptfunktion in C

Der bereitgestellte Codeausschnitt versucht, die Funktion main() rekursiv in sich selbst in C aufzurufen. Es ist jedoch wichtig zu beachten, dass dieses Verhalten bei strikter C-Konformität nicht zulässig ist.

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

Gemäß dem C-Standard , kann sich eine Funktion nicht selbst direkt aufrufen, auch nicht die Funktion main(). Diese Einschränkung soll eine unendliche Rekursion verhindern und den Programmabbruch garantieren.

Praktische Umsetzung mit g

Trotz des Sprachstandards ist es in der Praxis möglich, main() rekursiv aufzurufen mit dem GNU C-Compiler (g). g setzt den Standard in dieser Hinsicht nicht strikt durch und ermöglicht das Kompilieren und Ausführen von Code mit rekursiven main()-Aufrufen.

Beispielcode

Der folgende geänderte Codeausschnitt demonstriert rekursive main()-Aufrufe mit g :

#include 
#include 
using namespace std;

int main() {
    int y = rand() % 10; // returns 3, then 6, then 7
    cout 

Beim Kompilieren und Ausführen generiert dieser Code die folgende Ausgabe:

y = 3
y = 6
y = 7

Assembly-Analyse

Die Untersuchung der für diesen Code generierten Assembly zeigt, dass g rekursive main()-Aufrufe wie jeden anderen Funktionsaufruf behandelt:

main:
        ...
        cmpl    $7, -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret

Hinweis:

Dieses Verhalten ist zwar mit g möglich, es ist jedoch wichtig zu beachten, dass es nicht garantiert ist. Andere Compiler halten sich möglicherweise strikt an den C-Standard, was zu Kompilierungsfehlern oder unerwartetem Verhalten führen kann. Daher wird die Verwendung rekursiver main()-Aufrufe nicht empfohlen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3