Pourquoi (et quand) dois-je utiliser des parenthèses après sizeof?
Ci-dessous ne peut pas compiler:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
mais si je l'ai changer pour
sizeof(arr);
tout va bien. Pourquoi?
- sizeof comme un opérateur n'est pas disponible en ansi-c
- ma copie de K&R (la première description du langage C que j'ai) est très loin et je ne peux pas le vérifier, mais je suis sûr à 110% il décrit
sizeof
fondamentalement la même façon Standard C99 ne le fait aujourd'hui.sizeof
est disponible depuis avant C a été normalisé par l'ANSI en 1989. - Désolé, mon mauvais..
Vous devez vous connecter pour publier un commentaire.
Selon 6.5.3, il existe deux formes de
sizeof
comme suit:Depuis
arr
dans votre code est untype-name
, il doit être mis entre parenthèses.sizeof
est un opérateur: la parenthèse "appartiennent à" le type de l'opérateur.sizeof
comme un opérateur.sizeof ( type-name )
. Mais pour la première forme, vous peut écrire, par exemple,sizeof(x)
, et bien qu'il ressemble à un appel de fonction (sisizeof
n'étaient pas un mot-clé), c'est vraiment un opérateur appliqué à une mise entre parenthèses de l'expression. Est-ce que vous aviez en tête?sizeof
est, du point de vue syntaxiquesizeof <SOMETHING>
par opposition aux fonctions, par exemple, à unprintf
qui estprintf ( <SOMETHING> )
. La parenthèse appartiennent à laprintf
mais pas àsizeof
. Lorsquesizeof
est appliqué à une mise entre parenthèses le nom de type, j'aime à penser que, comme une troupe de rien -- "le retour" juste le type.sizeof ( type-name )
comme son propre genre d'expression. (La norme appelle un opérateur, mais( type-name )
n'est pas vraiment un opérande dans le sens habituel.)sizeof(0)["abcdefghij"]
est1
.sizeof(0)["abcdefghij"]
estsizeof("abcdefghij"[0])
. Voir stackoverflow.com/q/381542C'est la façon dont la langue est spécifiée, les noms de type doivent être mis entre parenthèses ici.
Supposons que la grammaire ressemblait à ceci:
sizeof unary-expression
sizeof type-name
Maintenant, par exemple, l'expression suivante serait ambigu:
Il pourrait être soit
sizeof(int *) + 0
ousizeof(int) * +0
. Cette ambiguïté ne se pose pas pour unaire expressions, comme un astérisque ajouté à une expression n'est pas une expression (mais pour certains noms de type, avec l'ajout de l'un, est de nouveau un nom du type).Quelque chose devait être spécifié ici et exigeant type-les noms entre parenthèses est un moyen de résoudre l'ambiguïté.
Je pense que c'est parce que vous avez
typedef
. Si vous l'enlevez, il doit compiler.Exemple de wikipedia: