Heim >Backend-Entwicklung >C++ >Warum führt der rekursive Aufruf von „main()' in C zu undefiniertem Verhalten?
Rekursive Aufrufe von Main in C: Eine Reise in undefinierte Gebiete
Der unten dargestellte verwirrende Codeausschnitt hat in der Programmiergemeinschaft Neugier geweckt:
int main () { return main(); }
Zum Erstaunen vieler lässt sich dieser Code erfolgreich kompilieren. Allerdings offenbart seine Ausführung ein faszinierendes Verhalten: Es läuft auf unbestimmte Zeit. Diese eigenartige Beobachtung hat Fragen über die zugrunde liegende Mechanik aufgeworfen.
Das Dilemma des Aufrufs von Main
Der C-Standard erklärt in [basic.start.main] p3 ausdrücklich, dass „ Die Funktion main darf nicht durch einen Ausdruck benannt werden.“ Dieses Verbot ergibt sich aus der Natur von main als Einstiegspunkt des Programms, den die Laufzeitbibliothek einmal aufruft. Alle nachfolgenden Aufrufe von main sind nicht zulässig, daher fehlt ein benannter Ausdruck.
Compilerverhalten und undefiniertes Verhalten
Gemäß [intro.compliance.general], a Die Pflicht des Compilers besteht darin, aus wohlgeformten Programmen ausführbaren Code zu generieren. Es kann zwar Warnungen oder Fehler ausgeben, es ist jedoch nicht erforderlich, alle Regeln durchzusetzen. In diesem speziellen Fall liegt es im Ermessen der Compiler, anders auf den Verstoß durch den Aufruf von main zu reagieren.
Embrace the Unknown
Letztendlich ist das entscheidende Urteil über das Verhalten von this Codeausschnitt liegt im Bereich undefinierten Verhaltens. Gemäß der Definition des Standards kann alles passieren, wenn undefiniertes Verhalten auftritt. Versuche, solche Ergebnisse zu rationalisieren, sind zwecklos, da die Konsequenzen völlig unvorhersehbar sind.
Zusammenfassend lässt sich sagen, dass die Syntax des vorgestellten Codes zwar gültig ist, seine Ausführung jedoch zu undefiniertem Verhalten führt. Beachten Sie am besten das im Standard enthaltene Verbot benannter Ausdrücke, die main aufrufen, damit sich Ihre Programme nicht auf unvorhersehbare Reisen ins Unbekannte begeben.
Das obige ist der detaillierte Inhalt vonWarum führt der rekursive Aufruf von „main()' in C zu undefiniertem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!