Warum wird sizeof
ein Operator und keine Funktion betrachtet?
Welche Eigenschaft ist erforderlich, um sich als Betreiber zu qualifizieren?
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 vonsizeof
- sie sind erforderlich, wenn die Größe eines Typs verwendet wird, jedoch nicht, wenn die Größe eines Ausdrucks verwendet wird. Siehe zB hiersizeof
:sizeof unary-expression
undsizeof ( 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:
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.quelle
Und der Standard ist wahrscheinlich richtig, weil
sizeof
ein Typ und nimmt(Wikipedia)
quelle
Weil es keine Funktion ist. Sie können es so verwenden:
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.
quelle
Weil:
sizeof
"Funktion" die Größe nicht bestimmen kannquelle
Es gibt einen kleinen Unterschied zur Funktion - der Wert von sizeof wird zur Kompilierungszeit aufgelöst, jedoch nicht zur Laufzeit!
quelle
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 ++.
quelle
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.
quelle
sizeof()
Operator ist eine Kompilierungszeit, die auftreten würde. Es kann verwendet werden, um die Parameter oder Argumente zu bestimmen.quelle
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.
quelle