Antworten:
Weil der C-Standard dies sagt und es die einzige Stimme bekommt.
Als Konsequenzen:
sizeof (int)
anstelle eines Objektausdrucks ein Typ in Klammern sein .int a; printf("%d\n", sizeof a);
ist vollkommen in Ordnung. Sie werden oft gesehen, zum einen, weil sie als Teil eines Typ-Cast-Ausdrucks benötigt werden, und zum anderen, weil sizeof eine sehr hohe Priorität hat und daher sizeof a + b
nicht dasselbe ist 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 andere Unterschiede zwischen einer Funktion und einem unären Operator, aber ich denke, das reicht aus, um zu zeigen, warum sizeof keine Funktion sein kann, selbst wenn es einen Grund gibt, dies zu wollen.
sizeof
Nebenwirkungen zulassen , wenn der Ausdruck eine VLA enthält.
(int)
ist nichts Besonderes - nur ein Name eines Typs in Klammern. Klammern hier sind Teil der Syntax von sizeof
- sie sind erforderlich, wenn die Größe eines Typs verwendet wird, jedoch nicht, wenn die Größe eines Ausdrucks verwendet wird. Siehe zB hier
sizeof
: sizeof unary-expression
und sizeof ( type-name )
- daher wird er im C11-Standard nicht als "Besetzung", sondern als Typname in Klammern betrachtet. Das Nettoergebnis ist ähnlich. (Zum Vergleich ist ein Besetzungsausdruck ( type-name ) cast-expression
.) Und ich hasse die Art und Weise, wie der Kommentar Markdown anders funktioniert als der Q & A Markdown!
Es kann als Konstante zur Kompilierungszeit verwendet werden, was nur möglich ist, wenn es sich eher um einen Operator als um eine Funktion handelt. Zum Beispiel:
union foo {
int i;
char c[sizeof(int)];
};
Wenn es kein Operator wäre, müsste es sich syntaktisch um ein Präprozessor-Makro handeln, da Funktionen keine Typen als Argumente verwenden können. Dies wäre ein schwierig zu implementierendes Makro, da sizeof
sowohl Typen als auch Variablen als Argument herangezogen werden können.
Weil der C-Standard dies sagt und es die einzige Stimme bekommt.
Und der Standard ist wahrscheinlich richtig, weil sizeof
ein Typ und nimmt
Wenn entweder die Domäne oder die Codomäne (oder beide) einer Funktion Elemente enthält, die wesentlich komplexer als reelle Zahlen sind, wird diese Funktion im Allgemeinen als Operator bezeichnet. Wenn umgekehrt weder die Domäne noch die Codomäne einer Funktion Elemente enthalten, 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 als die generische F-Form (x, y, z, ...) entwickelt haben, werden die resultierenden Sonderformen auch als Operatoren bezeichnet. Beispiele sind Infix-Operatoren wie Addition "+" und Division "/" sowie Postfix-Operatoren wie Fakultät "!". Diese Verwendung hängt nicht mit der Komplexität der beteiligten Entitäten zusammen.
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 soll zur Laufzeit (oder inline) ausgeführt werden, die Größe muss zur Kompilierungszeit bestimmt werden.
Weil:
sizeof
"Funktion" die Größe nicht bestimmen kannEs gibt einen kleinen Unterschied zur Funktion - der Wert von sizeof wird zur Kompilierungszeit aufgelöst, jedoch nicht zur Laufzeit!
Da es sich um einen Operator zur Kompilierungszeit handelt , der zur Berechnung der Größe eines Objekts Typinformationen benötigt, die nur zur Kompilierungszeit verfügbar sind. Dies gilt nicht für C ++.
Der Operator sizeof ist eine Entität zur Kompilierungszeit, keine Laufzeit, und benötigt keine Klammern wie eine Funktion. Wenn Code kompiliert wird, ersetzt er den Wert zur Kompilierungszeit durch die Größe dieser Variablen. Wenn jedoch die Funktion ausgeführt wird, nachdem die Funktion ausgeführt wurde, kennen wir den Rückgabewert.
Sizeof (), ich denke offensichtlich, es ist sowohl eine Funktion als auch ein Operator. Warum? Weil eine Funktion in der Eintrittsphase Klammern für die Eingabe enthält. Aber hauptsächlich auch ein Operator, weil Operatoren Aktionszeichen sind, daher ist sizeof eine Aktionsanweisung, die auf den Operanden in Klammern wirkt.