Warum entspricht der Funktionsname dem Funktionszeiger mit dem Adressenoperator?
In der C-Programmierung wird ein Funktionsname als Funktionszeiger verwendet entspricht der Anwendung des Adressenoperators (&) auf den Funktionsnamen. Diese scheinbare Inkonsistenz mit anderen Sprachelementen, wie z. B. Arrays, hat eine bestimmte Begründung.
Begründung der Funktionsnamenäquivalenz
Gemäß dem ANSI C90-Begründungsdokument ist die Äquivalenz Zur Verbesserung der Benutzerfreundlichkeit wurde eine Trennung zwischen Funktionsbezeichnern (Funktionsnamen) und Funktionszeigern eingeführt. Indem beide Notationen zugelassen werden, bietet die Sprache eine Kurzform zum Aufrufen von Mitgliedsfunktionen in gepackten Strukturen. Zum Beispiel:
graphics.open(file) // Equivalent to (*graphics.open)(file)
Kuriositäten von Funktionsbezeichnern
Diese Äquivalenz führt zu eigenartigen, aber gültigen syntaktischen Formen:
( &f)(); f(); (*f)(); (**f)(); (***f)(); pf(); (*pf)(); (**pf)(); (***pf)();
Das Komitee begründete das hätte das Verbot von Formen wie (f)() bei gleichzeitigem Zulassen von a (für int a[]) zur Folge gehabt war unnötig und unpraktisch.
Ausnahmen in Parameter- und Rückgabetypen
Interessanterweise kann ein Funktionstyp implizit in einen Zeiger auf sich selbst als Parameter konvertiert werden (z. B. void). g(Funktionstyp)). Bei Verwendung als Rückgabetyp (z. B. FunctionType h();) kann er jedoch nicht in einen Zeiger konvertiert werden. Durch diese Unterscheidung wird sichergestellt, dass Kompatibilitätsprobleme mit Funktionstypen vermieden werden.
Das obige ist der detaillierte Inhalt vonWarum sind Funktionsnamen äquivalent zu Funktionszeigern mit dem Address-of-Operator in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!