¿Por qué sizeof se considera un operador?

93

¿Por qué se sizeofconsidera un operador y no una función?

¿Qué propiedad es necesaria para calificar como operador?

Arpit
fuente

Respuestas:

181

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

Como consecuencias:

  • El operando de sizeof puede ser un tipo entre paréntesis sizeof (int), en lugar de una expresión de 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 tipos y, en segundo lugar, porque sizeof tiene una prioridad muy alta, por sizeof a + blo que no es lo mismo que sizeof (a+b). Pero no forman 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 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 función. De hecho, ese es el punto de tamaño.

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 lo fuera.

Steve Jessop
fuente
3
¡Guau, justo lo que estaba pensando!
crashmstr
7
No puedo decirlo mejor.
Clement Herreman
Creo que las cosas son más complejas hoy en día debido a las matrices de longitud variable (VLA). IIRC, el estándar incluso permitiría sizeoftener efectos secundarios si hay un VLA en la expresión.
Aaron McDaid
@glglgl No, eso no tiene ningún sentido. En ese contexto, (int)no es nada lujoso, solo un nombre de un tipo entre paréntesis. Los paréntesis aquí son parte de la sintaxis de sizeof: son obligatorios cuando se toma el tamaño de un tipo, pero no se requieren cuando se toma el tamaño de una expresión. Véase, por ejemplo, aquí
anatolyg
1
El estándar utiliza dos notaciones para sizeof: sizeof unary-expressiony sizeof ( type-name )- por lo que en el estándar C11 no se considera un 'molde' sino un nombre de tipo entre paréntesis. El resultado neto es muy parecido. (A modo de comparación, una expresión de elenco es ( type-name ) cast-expression). ¡Y odio la forma en que el comentario Markdown funciona de manera diferente a Q&A Markdown!
Jonathan Leffler
24

Puede usarse como una constante en tiempo de compilación, lo cual solo es posible si es 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 de preprocesador ya que las funciones no pueden tomar tipos como argumentos. Esa sería una macro difícil de implementar ya que sizeofpuede tomar tanto tipos como variables como argumento.

John Kugelman
fuente
4
+1 pero tenga en cuenta que no es una constante en tiempo de compilación cuando el argumento es un VLA - matriz de longitud variable.
Jonathan Leffler
6

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

Y el estándar probablemente sea correcto porque sizeoftoma un tipo y

En general, si el dominio o el codominio (o ambos) de una función contiene elementos significativamente más complejos que los números reales, esa función se denomina 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 utilizan con tanta frecuencia que han evolucionado más rápido o con notaciones más fáciles que la forma genérica F (x, y, z, ...), las formas especiales resultantes también se denominan operadores. Los ejemplos incluyen operadores infijos como suma "+" y división "/", y operadores sufijos como factorial "!". Este uso no está relacionado con la complejidad de las entidades involucradas.

(Wikipedia)

Daniel Brückner
fuente
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.
Steve Jessop
5

Porque no es una función. Puedes usarlo así:

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

La función tiene un punto de entrada, código, etc. La función debe ejecutarse en tiempo de ejecución (o en línea), el tamaño de debe determinarse en tiempo de compilación.

Michał Górny
fuente
2

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

Deepak Kumar 'CLASIFICADO'
fuente
1

Porque:

  • cuando pasas un valor a una función, el tamaño del objeto no se pasa a la función, por lo que una sizeof"función" 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 se puede pasar un tipo a una función en C)
  • llamar a una función implica hacer una copia de los argumentos y otros gastos generales innecesarios
Artelius
fuente
1

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

Dewfy
fuente
7
Excepto para VLA - matriz de longitud variable - argumentos.
Jonathan Leffler
1

Porque es un operador en tiempo de compilación que, para calcular el tamaño de un objeto, requiere información de tipo que solo está disponible en tiempo de compilación. Esto no es válido para C ++.

João Silva
fuente
0

sizeof()El operador es un tiempo de compilación. Puede usarse para determinar los parámetros o argumentos.

Ganesh
fuente
-1

Sizeof (), creo que obviamente es tanto una función como un operador. ¿Por qué? Porque una función tiene paréntesis para la entrada en la etapa de entrada. Pero principalmente también los operadores de causa de un operador son un carácter de acción, por lo tanto, sizeof es una declaración de acción que actúa sobre el operando entre paréntesis.

Salón Enoch Asanda
fuente