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.
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