Ce qui suit ne parvient pas à compiler:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
mais si je le change en
sizeof(arr);
tout va bien. Pourquoi?
Selon 6.5.3, il existe deux formes pour sizeof
comme suit:
sizeof unary-expression
sizeof ( type-name )
Puisque arr
dans votre code est un type-name
, il doit être entre parenthèses.
C'est la façon dont la langue est spécifiée, les noms de type doivent être entre parenthèses ici.
Supposons que la grammaire ressemble à ceci:
sizeof unary-expression
sizeof type-name
Maintenant, par exemple l'expression suivante serait ambiguë:
sizeof int * + 0
Il peut s'agir de sizeof(int *) + 0
ou sizeof(int) * +0
. Cette ambiguïté ne se pose pas pour les expressions unaires, car un astérisque ajouté à une expression n'est pas une expression (mais pour certains noms de type, en ajouter un est à nouveau un nom de type).
Quelque chose devait être spécifié ici et exiger que les noms de type soient entre parenthèses est un moyen de résoudre l'ambiguïté.