Warum wird sizeof als Operator angesehen?

93

Warum wird sizeofein Operator und keine Funktion betrachtet?

Welche Eigenschaft ist erforderlich, um sich als Betreiber zu qualifizieren?

Arpit
quelle

Antworten:

180

Weil der C-Standard dies sagt und es die einzige Stimme bekommt.

Als Konsequenzen:

  • Der Operand von sizeof kann sizeof (int)anstelle eines Objektausdrucks ein Typ in Klammern sein .
  • Die Klammern sind unnötig: 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 + bnicht dasselbe ist wie sizeof (a+b). Aber sie sind nicht Teil des Aufrufs von sizeof, sondern Teil des Operanden.
  • Sie können die Adresse von sizeof nicht übernehmen.
  • Der Ausdruck, der der Operand von sizeof ist, wird zur Laufzeit nicht ausgewertet ( sizeof a++ändert a nicht).
  • Der Ausdruck, der der Operand von sizeof ist, kann einen beliebigen Typ außer void oder Funktionstypen haben. In der Tat ist das eine Art Punkt der Größe von.

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.

Steve Jessop
quelle
3
Wow, genau das, was ich dachte!
Crashmstr
7
Kann es nicht besser sagen.
Clement Herreman
Ich glaube, dass die Dinge heutzutage aufgrund von Arrays variabler Länge (VLA) komplexer sind. IIRC, der Standard würde sogar sizeofNebenwirkungen zulassen , wenn der Ausdruck eine VLA enthält.
Aaron McDaid
@glglgl Nein, das macht keinen Sinn. In diesem Zusammenhang (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
Anatolyg
1
Der Standard verwendet zwei Notationen für sizeof: sizeof unary-expressionund 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!
Jonathan Leffler
23

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 sizeofsowohl Typen als auch Variablen als Argument herangezogen werden können.

John Kugelman
quelle
4
+1, aber beachten Sie, dass es sich nicht um eine Konstante zur Kompilierungszeit handelt, wenn das Argument ein VLA-Array mit variabler Länge ist.
Jonathan Leffler
6

Weil der C-Standard dies sagt und es die einzige Stimme bekommt.

Und der Standard ist wahrscheinlich richtig, weil sizeofein 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.

(Wikipedia)

Daniel Brückner
quelle
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
4

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.

Michał Górny
quelle
1

Weil:

  • Wenn Sie einen Wert an eine Funktion übergeben, wird die Größe des Objekts nicht an die Funktion übergeben sizeof "Funktion" die Größe nicht bestimmen kann
  • In C können Funktionen nur einen Argumenttyp akzeptieren. sizeof () muss alle möglichen unterschiedlichen Dinge akzeptieren (sowohl Variablen als auch Typen! Sie können einen Typ nicht an eine Funktion in C übergeben)
  • Beim Aufrufen einer Funktion wird eine Kopie der Argumente und anderer unnötiger Overhead erstellt
Artelius
quelle
1

Es gibt einen kleinen Unterschied zur Funktion - der Wert von sizeof wird zur Kompilierungszeit aufgelöst, jedoch nicht zur Laufzeit!

Dewfy
quelle
7
Mit Ausnahme von VLA - Array - Argumenten variabler Länge.
Jonathan Leffler
1

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 ++.

João Silva
quelle
1

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.

Deepak Kumar 'SORTIERT'
quelle
0

sizeof()Operator ist eine Kompilierungszeit, die auftreten würde. Es kann verwendet werden, um die Parameter oder Argumente zu bestimmen.

Ganesh
quelle
-1

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.

Enoch Asanda Hall
quelle