web-dev-qa-db-fra.com

Pourquoi sizeof int est faux, alors que sizeof (int) a raison?

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

la première utilisation de sizeof est incorrecte, 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. Volonté sizeof int provoquer une ambiguïté?

96
Yishu Fang

Les éléments suivants peuvent être ambigus:

sizeof int * + 1

Est-ce (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 donc il n'y a 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 s'agit de (sizeof(int*))+1, passizeof((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 é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 simple nom de type, il ne peut pas s'agir simplement d'un ancien identifiant de type pouvant contenir des espaces ou de la ponctuation de fin. Peut-être que sizeof aurait pu être défini avec la même restriction, je n'en suis pas certain.

101
Steve Jessop

De 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.

32
Jainendra

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, selon la définition de la syntaxe du langage. Si vous utilisez sizeof sur une expression, vous n'avez pas besoin de parenthèses.

La norme C donne un tel exemple de l'endroit où vous voudrez peut-être l'utiliser sur une expression:

sizeof array / sizeof array[0]

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

6
Lundin