Heim  >  Artikel  >  Backend-Entwicklung  >  Warum sind Funktionsnamen äquivalent zu Funktionszeigern mit dem Address-of-Operator in C?

Warum sind Funktionsnamen äquivalent zu Funktionszeigern mit dem Address-of-Operator in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-15 07:27:02634Durchsuche

Why are Function Names Equivalent to Function Pointers with the Address-of Operator in C?

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!

Stellungnahme:
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