Pourquoi sizeof est-il considéré comme un opérateur?

93

Pourquoi est-il sizeofconsidéré comme un opérateur et non comme une fonction?

Quelle propriété est nécessaire pour se qualifier en tant qu'opérateur?

Arpit
la source

Réponses:

181

Parce que la norme C le dit et qu'elle obtient le seul vote.

Comme conséquences:

  • L'opérande de sizeof peut être un type entre parenthèses,, sizeof (int)au lieu d'une expression d'objet.
  • Les parenthèses sont inutiles: int a; printf("%d\n", sizeof a);c'est parfaitement bien. Ils sont souvent vus, d'une part parce qu'ils sont nécessaires dans le cadre d'une expression de conversion de type, et d'autre part parce que sizeof a une priorité très élevée, donc sizeof a + bn'est pas la même chose que sizeof (a+b). Mais ils ne font pas partie de l'invocation de sizeof, ils font partie de l'opérande.
  • Vous ne pouvez pas prendre l'adresse de sizeof.
  • L'expression qui est l'opérande de sizeof n'est pas évaluée à l'exécution ( sizeof a++ne modifie pas a).
  • L'expression qui est l'opérande de sizeof peut avoir n'importe quel type à l'exception des types void ou function. En effet, c'est un peu le point de taille de.

Une fonction différerait sur tous ces points. Il y a probablement d'autres différences entre une fonction et un opérateur unaire, mais je pense que cela suffit pour montrer pourquoi sizeof ne pouvait pas être une fonction même s'il y avait une raison de le vouloir.

Steve Jessop
la source
3
Wow, juste ce que je pensais!
crashmstr
7
Je ne peux pas dire mieux.
Clement Herreman
Je pense que les choses sont plus complexes de nos jours en raison des tableaux de longueur variable (VLA). IIRC, la norme permettrait même sizeofd'avoir des effets secondaires s'il y a un VLA dans l'expression.
Aaron McDaid du
@glglgl Non, cela n'a aucun sens. Dans ce contexte, il (int)n'y a rien d'extraordinaire - juste un nom d'un type entre parenthèses. Les parenthèses font partie de la syntaxe de sizeof- elles sont obligatoires pour prendre la taille d'un type, mais pas pour prendre la taille d'une expression. Voir par exemple ici
anatolyg
1
La norme utilise deux notations pour sizeof: sizeof unary-expressionet sizeof ( type-name )- donc dans la norme C11, il n'est pas considéré comme un 'cast' mais un nom de type entre parenthèses. Le résultat net est sensiblement le même. (À titre de comparaison, une expression de distribution l'est ( type-name ) cast-expression.) Et je déteste la façon dont ce commentaire Markdown fonctionne différemment de Q&A Markdown!
Jonathan Leffler
24

Elle peut être utilisée comme constante de compilation, ce qui n'est possible que s'il s'agit d'un opérateur plutôt que d'une fonction. Par exemple:

union foo {
    int i;
    char c[sizeof(int)];
};

Syntaxiquement, si ce n'était pas un opérateur, alors il faudrait que ce soit une macro de préprocesseur car les fonctions ne peuvent pas prendre de types comme arguments. Ce serait une macro difficile à implémenter car elle sizeofpeut prendre à la fois des types et des variables comme argument.

John Kugelman
la source
4
+1 mais notez qu'il ne s'agit pas d'une constante de compilation lorsque l'argument est un tableau de longueur variable VLA.
Jonathan Leffler
6

Parce que la norme C le dit et qu'elle obtient le seul vote.

Et la norme est probablement correcte car sizeofprend un type et

En général, si le domaine ou le codomaine (ou les deux) d'une fonction contient des éléments beaucoup plus complexes que les nombres réels, cette fonction est appelée opérateur. Inversement, si ni le domaine ni le codomaine d'une fonction ne contiennent des éléments plus compliqués que des nombres réels, cette fonction est susceptible d'être désignée simplement comme une fonction. Les fonctions trigonométriques telles que le cosinus sont des exemples de ce dernier cas.

De plus, lorsque les fonctions sont utilisées si souvent qu'elles ont évolué des notations plus rapidement ou plus facilement que la forme générique F (x, y, z, ...), les formes spéciales résultantes sont également appelées opérateurs. Les exemples incluent les opérateurs d'infixe tels que l'addition "+" et la division "/", et les opérateurs de suffixe tels que factoriel "!". Cet usage n'est pas lié à la complexité des entités impliquées.

(Wikipédia)

Daniel Brückner
la source
Ceci explique probablement la motivation du standard C (et d'autres langages de programmation) à utiliser les termes «opérateur» et «fonction» comme ils le font.
Steve Jessop
5

Parce que ce n'est pas une fonction. Vous pouvez l'utiliser comme ça:

int a;
printf("%d\n", sizeof a);

La fonction a un point d'entrée, un code, etc. La fonction doit être exécutée au moment de l'exécution (ou en ligne), sizeof doit être déterminée au moment de la compilation.

Michał Górny
la source
2

L'opérateur sizeof est une entité au moment de la compilation et non à l'exécution et n'a pas besoin de parenthèses comme une fonction. Lorsque le code est compilé, il remplace la valeur par la taille de cette variable au moment de la compilation, mais en fonction une fois que la fonction est exécutée, nous connaîtrons la valeur renvoyée.

Deepak Kumar 'TRIÉ'
la source
1

Car:

  • lorsque vous passez une valeur à une fonction, la taille de l'objet n'est pas transmise à la fonction, donc un sizeof "fonction" n'aurait aucun moyen de déterminer la taille
  • en C, les fonctions ne peuvent accepter qu'un seul type d'argument; sizeof () doit accepter toutes sortes de choses différentes (variables aussi bien que types! Vous ne pouvez pas passer un type à une fonction en C)
  • appeler une fonction implique de faire une copie des arguments et d'autres frais généraux inutiles
Artelius
la source
1

Il y a une petite différence par rapport à la fonction - la valeur de sizeof est résolue au moment de la compilation, mais pas au moment de l'exécution!

Dewfy
la source
7
Sauf pour VLA - tableau de longueur variable - arguments.
Jonathan Leffler
1

Parce qu'il s'agit d'un opérateur au moment de la compilation qui, pour calculer la taille d'un objet, nécessite des informations de type qui ne sont disponibles qu'au moment de la compilation. Cela ne vaut pas pour C ++.

João Silva
la source
0

sizeof()opérateur est un temps de compilation serait une occurrence. Il peut être utilisé pour déterminer les paramètres ou les arguments.

Ganesh
la source
-1

Sizeof (), je pense évidemment que c'est à la fois une fonction et un opérateur. Pourquoi? Parce qu'une fonction contient des parenthèses pour l'entrée au stade de l'entrée. Mais principalement aussi un opérateur cause les opérateurs sont des caractères d'action, donc sizeof est une instruction d'action qui agit sur l'opérande entre parenthèses.

Salle Enoch Asanda
la source