web-dev-qa-db-fra.com

Pourquoi (et quand) dois-je utiliser des parenthèses après sizeof?

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?

77
blueshift

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.

111
Ise Wisteria

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-expressionsizeof 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é.

40
mafso