102 votes

Pourquoi sizeof est-il un opérateur?

Pourquoi sizeof considéré comme un opérateur et non comme une fonction? Quelle propriété est nécessaire pour que quelque chose soit qualifié d'opérateur?

190voto

Steve Jessop Points 166970

Parce que le C standard le dit, et il obtient le vote seulement.

Comme conséquences:

  • L'opérateur sizeof peut être un nu-cast, sizeof (int), au lieu d'un objet d'expression.
  • Les parenthèses sont inutiles: int a; printf("%d\n", sizeof a); est parfaitement bien. Ils sont souvent considérés, d'abord parce qu'elles sont nécessaires dans le cadre d'un type de fonte d'expression, et d'autre part parce que sizeof a une très haute priorité, sizeof a + b n'est pas le même qu' 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érateur sizeof n'est pas évaluée au moment de l'exécution (sizeof a++ ne modifie pas).
  • L'expression qui est l'opérateur sizeof peut avoir n'importe quel type, à l'exception de nullité, ou des types de fonction. En effet, c'est le genre de point de sizeof.

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

25voto

John Kugelman Points 108754

Il peut être utilisé comme une 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 devrait s'agir d'une macro de préprocesseur, car les fonctions ne peuvent pas prendre les types comme arguments. Ce serait une macro difficile à implémenter car sizeof peut prendre les types et les variables en argument.

6voto

Daniel Brückner Points 36242

Parce que le C standard le dit, et il obtient le vote seulement.

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

En général, si le domaine ou d'arrivée (ou les deux) d'une fonction contient des éléments beaucoup plus complexe que les nombres réels, cette fonction est appelée comme un opérateur. A l'inverse, si ni domaine, ni l'arrivée d'une fonction de contenir des éléments plus compliqué que de nombres réels, la fonction est susceptible d'être désignée simplement comme une fonction. Fonctions trigonométriques telles que les cosinus sont des exemples de ce dernier cas.

En outre, lorsque les fonctions sont utilisés si souvent qu'ils ont évolué plus rapide ou plus facile notations que pour le générique de F(x,y,z,...), les conséquences sur les formes sont aussi appelés des opérateurs. Les exemples incluent des opérateurs infixes, telles que l'addition "+" et la division "/", et le suffixe des opérateurs comme factorielle "!". Cette utilisation n'est pas liée à la complexité des entités impliquées.

(Wikipédia)

5voto

Michał Górny Points 6450

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

1voto

Artelius Points 25772

Parce que:

  • Lorsque vous transmettez une valeur à une fonction, la taille de l'objet n'est pas transmise à la fonction. Par conséquent, 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 coûts inutiles

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X