Pourquoi sizeof int est faux, alors que sizeof (int) est correct?

Nous soaps que sizeof est un opérateur utilisé pour calculer la taille de tout type de données et de toute expression. 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; } 

la première utilisation de sizeof est fausse, alors que d’autres ont raison.

Lorsqu’il est compilé avec gcc, le message d’erreur suivant sera donné:

 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. La sizeof int causera-t-elle une ambiguïté?

Ce qui suit pourrait être ambigu:

 sizeof int * + 1 

Est-ce que (sizeof (int*)) + 1 , ou (sizeof(int)) * (+1) ?

De toute évidence, le langage C aurait pu introduire une règle pour résoudre l’ambiguïté, mais je peux imaginer pourquoi cela ne dérangeait pas. Avec le langage tel quel, un spécificateur de type n’apparaît jamais “nu” dans une expression, et il n’est donc pas nécessaire que des règles déterminent si ce second * 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 . C’est (sizeof(int*))+1 , pas sizeof((int*)(+1)) .

C ++ a un problème assez similaire à résoudre avec la syntaxe de dissortingbution de style fonction. Vous pouvez écrire int(0) et vous pouvez écrire typedef int *intptr; intptr(0); typedef int *intptr; intptr(0); , mais vous ne pouvez pas écrire int*(0) . Dans ce cas, la résolution est que le type “nu” doit être un nom de type simple, il ne peut pas simplement s’agir d’un ancien identifiant de type qui pourrait contenir des espaces ou des signes de ponctuation. Peut-être que sizeof aurait pu être défini avec la même ressortingction, je n’en suis pas certain.

De la norme C99

6.5.3.4.2
L’opérateur sizeof donne la taille (en octets) de son opérande, qui peut être une expression ou le nom entre parenthèses d’un type.

Dans votre cas, int n’est ni une expression ni un nom entre parenthèses.

Il y a deux manières d’utiliser l’opérateur sizeof dans C. La syntaxe est la suivante:

 C11 6.5.3 Unary operators ... sizeof unary-expression sizeof ( type-name ) 

Chaque fois que vous utilisez un type comme opérande, vous devez avoir la parenthèse, par la définition de la 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 l’endroit où vous pourriez vouloir l’utiliser sur une expression:

 sizeof array / sizeof array[0] 

Cependant, dans un souci de cohérence et pour éviter les bogues liés à la priorité des opérateurs, je vous conseillerais personnellement de toujours utiliser () quelle que soit la situation.