2011-05-05 12 views
61

La continuación falla al compilar:¿Por qué (y cuándo) necesito usar paréntesis después de sizeof?

typedef int arr[10]; 
int main(void) { 
    return sizeof arr; 
} 

sizeof.c:3: error: expected expression before ‘arr’ 

pero si lo cambio a

sizeof(arr); 

todo está bien. ¿Por qué?

+0

sizeof como un operador de anticipación en ANSI-C – Grim

+2

@Kostya: mi copia de K & R (la primera descripción de la lengua C que tengo) está muy lejos y yo no puedo verificarlo ahora, pero estoy 110% seguro de que describe 'sizeof' fundamentalmente de la misma manera que lo hace C99 Standard hoy en día. 'sizeof' está disponible desde antes de que C fuera estandarizado por ANSI en 1989. – pmg

+2

Lo siento, mi mal ... – Grim

Respuesta

99

De acuerdo con 6.5.3, existen dos formas para sizeof como los siguientes:

sizeof unary-expression 
sizeof (type-name) 

Desde arr en su código es un type-name, tiene que estar entre paréntesis.

+9

+1 y, solo para reforzar que' sizeof' es un operador: el paréntesis "pertenece" al tipo, no al operador . – pmg

+0

@pmg: ¡Gracias por aclarar! Sí, como mencionó, el estándar denota 'sizeof' como operador. –

+0

A7.4.8 en K & R, para retrogrouches como yo. – jtniehof

31

Así se especifica el idioma, los nombres de tipos deben estar entre paréntesis aquí.

Supongamos que la gramática veía así:

sizeof unary-expression sizeof type-name

Ahora, por ejemplo, la siguiente expresión sería ambigua:

sizeof int * + 0 

Podría ser cualquiera o sizeof(int *) + 0sizeof(int) * +0. Esta ambigüedad no se presenta para expresiones unarias, ya que un asterisco agregado a una expresión no es una expresión (pero para algunos nombres de tipos, al agregar uno, nuevamente se encuentra un nombre de tipo).

Se debe especificar algo aquí y es necesario que los nombres de tipos queden entre paréntesis para resolver la ambigüedad.

0

Creo que es porque tiene typedef. Si lo eliminas, debería compilarse.

Ejemplo de Wikipedia:

/* the following code fragment illustrates the use of sizeof  
* with variables and expressions (no parentheses needed), 
* and with type names (parentheses needed)  
*/ 
char c; 
printf("%zu,%zu\n", sizeof c, sizeof (int)); 
Cuestiones relacionadas