web-dev-qa-db-fra.com

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

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

Quelle propriété est nécessaire pour être considéré comme un opérateur?

82
Arpit

Parce que la norme C le dit, et 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); est parfaitement bien. Ils sont souvent vus, premièrement parce qu'ils sont nécessaires dans le cadre d'une expression de type cast, et deuxièmement parce que sizeof a une priorité très élevée, donc sizeof a + b N'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 au moment de l'exécution (sizeof a++ Ne modifie pas a).
  • L'expression qui est l'opérande de sizeof peut avoir n'importe quel type sauf void ou types de fonctions. En effet, c'est un peu le point de taille de.

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

169
Steve Jessop

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, s'il ne s'agissait pas d'un opérateur, il faudrait qu'il s'agisse d'une macro de préprocesseur, car les fonctions ne peuvent pas prendre de types comme arguments. Ce serait une macro difficile à implémenter car sizeof peut prendre à la fois les types et les variables comme argument.

21
John Kugelman

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

Et la norme est probablement correcte car sizeof prend un type et

En général, si le domaine ou le domaine codé (ou les deux) d'une fonction contient des éléments beaucoup plus complexes que des nombres réels, cette fonction est appelée opérateur. Inversement, si ni le domaine ni le domaine de codage d'une fonction ne contiennent des éléments plus compliqués que des nombres réels, cette fonction sera probablement appelée simplement 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é 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 infixes tels que l'addition "+" et la division "/", et les opérateurs postfixes tels que le factoriel "!". Cette utilisation n'est pas liée à la complexité des entités impliquées.

(Wikipedia)

5
Daniel Brückner

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 intégrée), sizeof doit être déterminée au moment de la compilation.

4
Michał Górny

Car:

  • lorsque vous passez une valeur à une fonction, la taille de l'objet n'est pas transmise à la fonction, donc une 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 et types! Vous ne pouvez pas passer un type à une fonction en C)
  • appeler une fonction implique de faire une copie des arguments et autres frais généraux inutiles
1
Artelius

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!

1
Dewfy

Parce que c'est 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++.

1
João Silva

l'opérateur sizeof est une entité de compilation et non une 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 dans la fonction après que la fonction est exécutée, nous connaîtrons la valeur de retour.

1

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

0
ganesh