Warum ist sizeof
als Operator und nicht als Funktion betrachtet?
Welche Eigenschaft ist notwendig, um sich als Betreiber zu qualifizieren?
Arpit
Warum ist sizeof
als Operator und nicht als Funktion betrachtet?
Welche Eigenschaft ist notwendig, um sich als Betreiber zu qualifizieren?
Steve Jessop
Weil es die C-Norm so vorschreibt, und sie die einzige Stimme bekommt.
Als Folgen:
sizeof (int)
anstelle eines Objektausdrucks.int a; printf("%d\n", sizeof a);
ist vollkommen in Ordnung. Sie werden oft gesehen, erstens, weil sie als Teil eines Typumwandlungsausdrucks benötigt werden, und zweitens, weil sizeof einen sehr hohen Vorrang hat sizeof a + b
ist nicht dasselbe wie sizeof (a+b)
. Aber sie sind nicht Teil des Aufrufs von sizeof, sondern Teil des Operanden.sizeof a++
ändert a) nicht.Eine Funktion würde sich in all diesen Punkten unterscheiden. Es gibt wahrscheinlich noch andere Unterschiede zwischen einer Funktion und einem unären Operator, aber ich denke, das reicht aus, um zu zeigen, warum sizeof keine Funktion sein konnte, selbst wenn es einen Grund dafür gab, dass es so sein sollte.
Wow, genau das habe ich mir gedacht!
– crashmstr
8. September 2009 um 11:58 Uhr
Ich glaube, dass die Dinge heutzutage aufgrund von Arrays mit variabler Länge (VLA) komplexer sind. IIRC würde der Standard sogar zulassen sizeof
Nebenwirkungen haben, wenn ein VLA im Ausdruck vorhanden ist.
– Aaron McDaid
27. Januar 2015 um 10:53 Uhr
@glglgl Nein, das ergibt keinen Sinn. In diesem Zusammenhang (int)
ist nichts Besonderes – nur ein Name eines Typs in Klammern. Klammern sind hier ein Teil der Syntax von sizeof
– Sie sind erforderlich, wenn die Größe eines Typs genommen wird, aber nicht erforderlich, wenn die Größe eines Ausdrucks genommen wird. Siehe zB hier
– anatolyg
7. Oktober 2016 um 19:09 Uhr
@anatolyg Mein Kommentar ist lange her, ich nehme an, ich habe damals versucht, sarkastisch zu sein.
– glglgl
10. Oktober 2016 um 9:07 Uhr
Der Standard verwendet zwei Notationen für sizeof
: sizeof unary-expression
und sizeof ( type-name )
— Im C11-Standard wird es also nicht als „Abguss“ angesehen, sondern als Typname in Klammern. Das Nettoergebnis ist sehr ähnlich. (Zum Vergleich: Ein Cast-Ausdruck ist ( type-name ) cast-expression
.) Und ich hassen die Art und Weise, wie dieser Kommentar-Markdown anders funktioniert als Q&A-Markdown!
– Jonathan Leffler
30. Mai 2017 um 1:13 Uhr
Es kann als Kompilierzeitkonstante verwendet werden, was nur möglich ist, wenn es sich um einen Operator und nicht um eine Funktion handelt. Zum Beispiel:
union foo {
int i;
char c[sizeof(int)];
};
Wenn es sich nicht um einen Operator handeln würde, müsste es sich syntaktisch um ein Präprozessormakro handeln, da Funktionen keine Typen als Argumente annehmen können. Das wäre ein schwer zu implementierendes Makro, da sizeof
kann sowohl Typen als auch Variablen als Argument annehmen.
+1, aber beachten Sie, dass es keine Kompilierzeitkonstante ist, wenn das Argument ein VLA-Array mit variabler Länge ist.
– Jonathan Leffler
8. September 2009 um 12:29 Uhr
Weil es die C-Norm so vorschreibt, und sie die einzige Stimme bekommt.
Und der Standard ist wahrscheinlich richtig, weil sizeof
nimmt einen Typ und
Wenn entweder der Bereich oder der Kobereich (oder beide) einer Funktion Elemente enthält, die wesentlich komplexer sind als reelle Zahlen, wird diese Funktion im Allgemeinen als Operator bezeichnet. Umgekehrt, wenn weder die Domäne noch die Kodomäne einer Funktion Elemente enthält, die komplizierter als reelle Zahlen sind, wird diese Funktion wahrscheinlich einfach als Funktion bezeichnet. Trigonometrische Funktionen wie Cosinus sind Beispiele für den letzteren Fall.
Wenn Funktionen so oft verwendet werden, dass sie sich schneller oder einfacher entwickelt haben als die generische Form F (x, y, z, …), werden die resultierenden Sonderformen auch Operatoren genannt. Beispiele hierfür sind Infix-Operatoren wie der Zusatz „+“ und die Division „https://stackoverflow.com/“ sowie Postfix-Operatoren wie Fakultät „!“. Diese Verwendung steht in keinem Zusammenhang mit der Komplexität der beteiligten Entitäten.
Dies erklärt wahrscheinlich die Motivation des C-Standards (und anderer Programmiersprachen), die Begriffe “Operator” und “Funktion” so zu verwenden, wie sie es tun.
– Steve Jessop
8. September 2009 um 12:17 Uhr
Weil es keine Funktion ist. Sie können es so verwenden:
int a;
printf("%d\n", sizeof a);
Die Funktion hat einen Einstiegspunkt, Code usw. Die Funktion muss zur Laufzeit ausgeführt werden (oder inline), sizeof muss zur Kompilierzeit bestimmt werden.
sizeof-Operator ist eine Entität zur Kompilierungszeit, keine Laufzeiteinheit und benötigt keine Klammern wie eine Funktion. Wenn Code kompiliert wird, ersetzt er den Wert zur Kompilierzeit durch die Größe dieser Variablen, aber in Funktion nach Funktion wird ausgeführt, dann kennen wir den Rückgabewert.
Artelius
Da:
sizeof
“Funktion” hätte keine Möglichkeit, die Größe zu bestimmen
Taufrisch
Es gibt einen kleinen Unterschied zur Funktion – der Wert von sizeof wird zur Kompilierzeit aufgelöst, aber nicht zur Laufzeit!
Mit Ausnahme von VLA – Arrays variabler Länge – Argumente.
– Jonathan Leffler
8. September 2009 um 12:28 Uhr