¿Por qué sizeof(x++) no incrementa x?
Aquí está el código compilado en Dev-C++ en Windows:
#include <stdio.h>
int main() {
int x = 5;
printf("%d and ", sizeof(x++)); // note 1
printf("%d\n", x); // note 2
return 0;
}
Espero x
ser 6 después de ejecutar la nota 1 . Sin embargo, el resultado es:
4 and 5
¿ Por qué x
no se incrementa después de la nota 1 ?
Del Estándar C99 (el énfasis es mío)
6.5.3.4/2
El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando. El resultado es un número entero. Si el tipo de operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera.
sizeof
es un operador en tiempo de compilación , por lo que en el momento de la compilación sizeof
y su operando se reemplazan por el valor del resultado. El operando no se evalúa en absoluto (excepto cuando es una matriz de longitud variable); sólo importa el tipo de resultado.
short func(short x) { // this function never gets called !!
printf("%d", x); // this print never happens
return x;
}
int main() {
printf("%d", sizeof(func(3))); // all that matters to sizeof is the
// return type of the function.
return 0;
}
Producción:
2
ya que short
ocupa 2 bytes en mi máquina.
Cambiando el tipo de retorno de la función a double
:
double func(short x) {
// rest all same
dará 8
como salida.
sizeof(foo)
se esfuerza mucho por descubrir el tamaño de una expresión en tiempo de compilación:
6.5.3.4:
El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando. El resultado es un número entero. Si el tipo de operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera.
En resumen: matrices de longitud variable, ejecutadas en tiempo de ejecución. (Nota: las matrices de longitud variable son una característica específica, no matrices asignadas con malloc(3)
). De lo contrario, solo se calcula el tipo de expresión y eso en el momento de la compilación.