96 votes

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

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

la première utilisation de sizeof a tort, 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. Will sizeof int causer une quelconque ambiguïté ?

101voto

Steve Jessop Points 166970

Ce qui suit pourrait être ambigu :

sizeof int * + 1

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

Il est évident que le langage C aurait pu introduire une règle pour résoudre l'ambiguïté, mais je peux imaginer pourquoi il ne s'en est pas soucié. 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 résoudre la question de savoir si ce second spécificateur de type est un élément de l'expression. * 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 , no sizeof((int*)(+1)) .

Le C++ doit résoudre un problème quelque peu similaire avec la syntaxe des cast de style fonction. Vous pouvez écrire int(0) et vous pouvez écrire 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 être n'importe quel vieil identifiant de type qui pourrait avoir des espaces ou une ponctuation de fin. Peut-être sizeof aurait pu être défini avec la même restriction, je n'en suis pas certain.

32voto

Jaguar Points 8451

Desde Norme C99

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

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

6voto

Lundin Points 21616

Il existe deux façons d'utiliser l'opérateur sizeof en 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 syntaxique du langage. Si vous utilisez sizeof sur une expression, vous n'avez pas besoin des parenthèses.

La norme C donne un exemple de cas où vous pouvez l'utiliser dans une expression :

sizeof array / sizeof array[0]

Cependant, par souci de cohérence, et pour éviter les bugs liés à la précédence des opérateurs, je conseillerais personnellement de toujours utiliser () quelle que soit la situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X