Sabemos que sizeof
es un operador que se usa para calcular el tamaño de cualquier tipo de datos y expresión, y cuando el operando es una expresión, se pueden omitir los paréntesis.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
el primer uso de sizeof
es incorrecto, mientras que otros son correctos.
Cuando se compila usando gcc, aparecerá el siguiente mensaje de error:
main.c:5:9: error: expected expression before ‘int’
Mi pregunta es por qué el estándar C no permite este tipo de operación. ¿Causará sizeof int
alguna ambigüedad?
sizeof (int)a
.sizeof +(int)a
tiene la ventaja*&
de compilar realmente ;-)+
. Por ejemplo,sizeof +(char)a == sizeof(int)
debido a la promoción de números enteros, es probable que sea menos propenso a errores solo poner entre paréntesis si hay alguna preocupación acerca de la expresión de la que está tratando de tomar el tamaño. Así que no estoy seguro de ir tan lejos como para llamarlo "un uso", aunque admito que lo usé ...Respuestas:
Lo siguiente podría ser ambiguo:
¿Eso es
(sizeof (int*)) + 1
, o(sizeof(int)) * (+1)
?Obviamente, el lenguaje C podría haber introducido una regla para resolver la ambigüedad, pero puedo imaginar por qué no se molestó. Con el lenguaje tal como está, un especificador de tipo nunca aparece "desnudo" en una expresión, por lo que no hay necesidad de reglas para resolver si ese segundo
*
es parte del tipo o un operador aritmético.La gramática existente ya resuelve la posible ambigüedad de
sizeof (int *) + 1
. Es(sizeof(int*))+1
, nosizeof((int*)(+1))
.C ++ tiene un problema similar que resolver con la sintaxis de conversión de estilo de función. Puedes escribir
int(0)
y puedes escribirtypedef int *intptr; intptr(0);
, pero no puedes escribirint*(0)
. En ese caso, la resolución es que el tipo "desnudo" debe ser un nombre de tipo simple, no puede ser cualquier ID de tipo antiguo que pueda tener espacios o puntuación final. Tal vezsizeof
podría haberse definido con la misma restricción, no estoy seguro.fuente
new int*(X)
que sería ambiguo si C ++ no especificara que el nuevo operador toma la cadena más larga que posiblemente podría ser un tipo. Entonces en C ++ podrían haber hecho lo mismo con sizeof, supongo. Pero en C ++ se puede decirsizeof int()
cuál habría sido ambiguo (¿tipo o valor inicializado int?).sizeof int()
estaría mal formada ("nooperator()
parasize_t
"), ¡lo cual espero que no sea bienvenido!Desde C99 Standard
En su caso,
int
no hay expresión ni nombre entre paréntesis.fuente
Hay dos formas de usar el operador sizeof en C. La sintaxis es la siguiente:
Siempre que use un tipo como operando, debe tener el paréntesis, por la definición de sintaxis del lenguaje. Si usa sizeof en una expresión, no necesita el paréntesis.
El estándar C da un ejemplo de dónde podría querer usarlo en una expresión:
Sin embargo, en aras de la coherencia y para evitar errores relacionados con la precedencia del operador, personalmente recomendaría usar siempre () sin importar la situación.
fuente
sizeof expression
ysizeof(type)
, que se explica en esta respuesta.