¿Por qué sizeof(x++) no incrementa x?

Resuelto Neigyl R. Noval asked hace 12 años • 10 respuestas

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 xser 6 después de ejecutar la nota 1 . Sin embargo, el resultado es:

4 and 5

¿ Por qué xno se incrementa después de la nota 1 ?

Neigyl R. Noval avatar Nov 22 '11 18:11 Neigyl R. Noval
Aceptado

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.

pmg avatar Nov 22 '2011 11:11 pmg

sizeofes un operador en tiempo de compilación , por lo que en el momento de la compilación sizeofy 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 shortocupa 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á 8como salida.

codaddict avatar Nov 22 '2011 11:11 codaddict

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.

sarnold avatar Nov 22 '2011 11:11 sarnold