2009-09-08 13 views

Respuesta

152

Porque el estándar C lo dice, y obtiene el único voto.

Como consecuencias:

  • El operando de sizeof puede ser un tipo parenthesised, sizeof (int), en lugar de una expresión objeto.
  • Los paréntesis son innecesarios: int a; printf("%d\n", sizeof a); está perfectamente bien. A menudo se ven, en primer lugar porque se necesitan como parte de una expresión de conversión de tipo, y en segundo lugar porque sizeof tiene una precedencia muy alta, por lo que sizeof a + b no es lo mismo que sizeof (a+b). Pero no son parte de la invocación de sizeof, son parte del operando.
  • No puede tomar la dirección de sizeof.
  • La expresión que es el operando de sizeof no se evalúa en el tiempo de ejecución (sizeof a++ no modifica a).
  • La expresión que es el operando de sizeof puede tener cualquier tipo excepto void o tipos de funciones. De hecho, ese es el punto de sizeof.

Una función diferiría en todos esos puntos. Probablemente haya otras diferencias entre una función y un operador unario, pero creo que eso es suficiente para mostrar por qué sizeof no podría ser una función, incluso si hubiera una razón para querer que sea.

+2

¡Guau, justo lo que estaba pensando! – crashmstr

+6

No puedo decirlo mejor. –

+0

explicación increíble! –

3

Porque no es una función. Se puede utilizar como esa:

int a; 
printf("%d\n", sizeof a); 

Función tiene punto de entrada, código, etc. Función se va a ejecutar en tiempo de ejecución (o en línea), sizeof tiene que ser determinado en tiempo de compilación.

20

Se puede utilizar como una constante de tiempo de compilación, que solo es posible si se trata de un operador en lugar de una función. Por ejemplo:

union foo { 
    int i; 
    char c[sizeof(int)]; 
}; 

sintácticamente si no fuera un operador entonces tendría que ser una macro preprocesador ya que las funciones no pueden tener tipos como argumentos. Esa sería una macro difícil de implementar ya que sizeof puede tomar ambos tipos y variables como argumento.

+2

+1, pero tenga en cuenta que no es una constante en tiempo de compilación cuando el argumento es una matriz de longitud variable VLA. –

1

Porque:

  • cuando se pasa un valor a una función, el tamaño del objeto no se pasa a la función, por lo que una "función" sizeof no tendría forma de determinar el tamaño
  • en C, las funciones solo pueden aceptar un tipo de argumento; sizeof() necesita aceptar todo tipo de cosas diferentes (variables y tipos! No puede pasar un tipo a una función en C)
  • llamar a una función implica hacer una copia de los argumentos y otra sobrecarga innecesaria
0

Hay una pequeña diferencia con respecto a la función: el valor de sizeof se resuelve en tiempo de compilación, pero no en tiempo de ejecución.

+5

Excepto para VLA - matriz de longitud variable - argumentos. –

5

Porque el estándar C lo dice, y obtiene el único voto.

Y la norma es probablemente correcto porque sizeof tiene un tipo y

En general, si bien el dominio o codominio (o ambos) de una función contiene elementos mucho más complejos que los números reales, la función se conoce como un operador. Por el contrario, si ni el dominio ni el codominio de una función contienen elementos más complicados que los números reales, es probable que se haga referencia a esa función simplemente como una función. Las funciones trigonométricas como el coseno son ejemplos del último caso.

Además, cuando las funciones se usan con tanta frecuencia que han evolucionado de forma más rápida o más fácil que la forma genérica F (x, y, z, ...), las formas especiales resultantes también se llaman operadores. Los ejemplos incluyen operadores de infijo tales como la suma "+" y la división "/", y operadores de postfix como factorial "!". Este uso no está relacionado con la complejidad de las entidades involucradas.

(Wikipedia)

+0

Esto probablemente explica la motivación del estándar C (y otros lenguajes de programación) al usar los términos "operador" y "función" como lo hacen. –

0

Debido a que es un operador de de tiempo de compilación que, con el fin de calcular el tamaño de un objeto, requiere escribir información que sólo está disponible en tiempo de compilación. Esto no es válido para C++.

1

sizeof operator es una entidad de tiempo de compilación no de tiempo de ejecución y no necesita paréntesis como una función. Cuando el código se compila, reemplaza el valor con el tamaño de esa variable en el momento de la compilación, pero en la función una vez que se ejecuta la función, sabremos el valor de retorno.

0

sizeof() operador es un momento de compilación ocurriría. Se puede usar para determinar los parámetros o argumentos.

+0

¿Por qué el voto a favor? –

Cuestiones relacionadas