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?
Parce que la norme C le dit, et elle obtient le seul vote.
Comme conséquences:
sizeof (int)
, au lieu d'une expression d'objet.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.sizeof a++
Ne modifie pas a).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.
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.
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.
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.
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 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++.
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.
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.