Heim >Backend-Entwicklung >C++ >Ist „widget w(gadget(), doodad());' eine Variablendeklaration oder eine Funktionsdeklaration in C?
Cs irritierendste Analyse: Das Geheimnis der Funktionsdeklarationen enthüllen
Beim Verständnis der Syntax von widget w(); ist einfach, viele Programmierer haben Schwierigkeiten zu verstehen, wie das folgende Codefragment eine Funktionsdeklaration darstellt:
widget w( gadget(), doodad() ); // pitfall: not a variable declaration
Um dieses Rätsel zu lösen, ist es wichtig, sich mit den Zerfallsregeln von C zu befassen. Innerhalb von Funktionsdeklarationen degenerieren Argumente von Array-Typen in Zeiger, die auf das erste Element zeigen, während Argumente von Funktionstypen in Funktionszeiger umgewandelt werden.
Durch die Anwendung dieses Prinzips wird der oben genannte Code in die folgende Signatur umgewandelt:
widget w( gadget(*)(), doodad(*)() );
Dies weist auf eine Funktion hin, die zwei Argumente akzeptiert: einen Zeiger auf eine Funktion, die keine Argumente akzeptiert und einen Gadget-Typ zurückgibt, und einen Zeiger auf eine Funktion, die ebenfalls akzeptiert Null Argumente und gibt einen Doodad-Typ zurück. Die Funktion selbst gibt ein Widget zurück.
Die Komplexität endet hier nicht. Betrachten Sie dieses verwirrende Beispiel:
widget w(gadget(x));
Wie kann dies möglicherweise eine Funktionsdeklaration sein, wenn x eine Variable ist?
In C ist es zulässig, beim Deklarieren von Variablen zusätzliche Klammern einzufügen, z Gerät x; und Gadget (x);. Dies gilt auch für Funktionsargumente, sodass der obige Code als Funktionsdeklaration interpretiert werden kann, die ein Argument namens x vom Typ Gadget akzeptiert und ein Widget zurückgibt.
Das obige ist der detaillierte Inhalt vonIst „widget w(gadget(), doodad());' eine Variablendeklaration oder eine Funktionsdeklaration in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!