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?
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 desizeof
- elles sont obligatoires pour prendre la taille d'un type, mais pas pour prendre la taille d'une expression. Voir par exemple icisizeof
:sizeof unary-expression
etsizeof ( 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:
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.la source
Et la norme est probablement correcte car
sizeof
prend un type et(Wikipédia)
la source
Parce que ce n'est pas une fonction. Vous pouvez l'utiliser comme ç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.
la source
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.
la source
Car:
sizeof
"fonction" n'aurait aucun moyen de déterminer la taillela source
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!
la source
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 ++.
la source
sizeof()
opérateur est un temps de compilation serait une occurrence. Il peut être utilisé pour déterminer les paramètres ou les arguments.la source
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.
la source