Nous savons que sizeof
c'est un opérateur utilisé pour calculer la taille de n'importe quel type de données et expression, et lorsque l'opérande est une expression, les parenthèses peuvent être omises.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
le premier usage de sizeof
est faux, tandis que d'autres ont raison.
Lorsqu'il est compilé à l'aide de gcc, le message d'erreur suivant s'affiche:
main.c:5:9: error: expected expression before ‘int’
Ma question est de savoir pourquoi la norme C ne permet pas ce type d'opération. Provoquera-t-il sizeof int
une ambiguïté?
sizeof (int)a
.sizeof +(int)a
a l'avantage*&
de compiler réellement ;-)+
. Par exemple, ensizeof +(char)a == sizeof(int)
raison de la promotion d'entiers, il est probablement moins sujet aux erreurs de simplement mettre entre parenthèses s'il y a un problème avec l'expression dont vous essayez de prendre la taille. Je ne suis donc pas sûr que j'irais jusqu'à l'appeler "une utilisation", même si j'avoue l'avoir utilisé ...Réponses:
Ce qui suit peut être ambigu:
Est-ce que c'est
(sizeof (int*)) + 1
ou(sizeof(int)) * (+1)
?Évidemment, le langage C aurait pu introduire une règle pour résoudre l'ambiguïté, mais je peux imaginer pourquoi cela n'a pas dérangé. Avec le langage tel qu'il est, un spécificateur de type n'apparaît jamais "nu" dans une expression, et il n'y a donc pas besoin de règles pour déterminer si cette seconde
*
fait partie du type ou d'un opérateur arithmétique.La grammaire existante résout déjà l'ambiguïté potentielle de
sizeof (int *) + 1
. Il est(sizeof(int*))+1
, nonsizeof((int*)(+1))
.C ++ a un problème quelque peu similaire à résoudre avec la syntaxe de conversion de style fonction. Vous pouvez écrire
int(0)
et vous pouvez écriretypedef int *intptr; intptr(0);
, mais vous ne pouvez pas écrireint*(0)
. Dans ce cas, la résolution est que le type "nu" doit être un nom de type simple, il ne peut pas s'agir de n'importe quel ancien identifiant de type pouvant contenir des espaces ou de la ponctuation à la fin. Peutsizeof
- être aurait-il pu être défini avec la même restriction, je ne suis pas certain.la source
new int*(X)
ce qui serait ambigu si C ++ ne spécifiait pas que le nouvel opérateur prend la chaîne la plus longue qui pourrait éventuellement être un type. Donc, en C ++, ils auraient pu faire la même chose avec sizeof, je suppose. Mais en C ++, vous pouvez diresizeof int()
ce qui aurait alors été ambigu (type ou valeur initialisé int?).sizeof int()
serait mal formée («nonoperator()
poursize_t
»), ce qui, je pense, ne serait pas le bienvenu!À partir de la norme C99
Dans votre cas, il
int
n'y a ni expression ni nom entre parenthèses.la source
Il existe deux façons d'utiliser l'opérateur sizeof en C. La syntaxe est la suivante:
Chaque fois que vous utilisez un type comme opérande, vous devez avoir la parenthèse, par la définition de syntaxe du langage. Si vous utilisez sizeof sur une expression, vous n'avez pas besoin de la parenthèse.
Le standard C donne un exemple de ce que vous pourriez vouloir utiliser sur une expression:
Cependant, dans un souci de cohérence et pour éviter les bogues liés à la priorité des opérateurs, je conseillerais personnellement de toujours utiliser () quelle que soit la situation.
la source
sizeof expression
etsizeof(type)
, ce qui est expliqué dans cette réponse.