Pourquoi est-il sizeof
considéré comme un opérateur et non comme une fonction?
Quelle propriété est nécessaire pour se qualifier en tant qu'opérateur?
Réponses:
Parce que la norme C le dit et qu'elle obtient le seul vote.
Comme conséquences:
sizeof (int)
au lieu d'une expression d'objet.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 + 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.sizeof a++
ne modifie pas a).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.
sizeof
d'avoir des effets secondaires s'il y a un VLA dans l'expression.
(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
sizeof
: sizeof unary-expression
et 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!
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 sizeof
peut prendre à la fois des types et des variables comme argument.
Parce que la norme C le dit et qu'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 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.
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.
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.
Car:
sizeof
"fonction" n'aurait aucun moyen de déterminer la tailleIl 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!
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 ++.
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.