Pregunta

HI,

Puede alguien ayudar a entender por qué el valor del cuadrado (x) es de 49?

Estoy utilizando Visual C ++ 6.0.

#define SQUARE(X) X * X

int main(int argc, char* argv[])
{
    int y = 5;

    printf("%d\n",SQUARE(++y));
    return 0;
}
¿Fue útil?

Solución

Neil Butterworth, Mark y Pavel son las adecuadas.

SQUARE (++ y) se expande a ++ y * ++ y, que incrementa el doble del valor de y.

Otro de los problemas que pueden surgir: SQUARE (a + b) se expande a + b * a + b que no es (a + b) * (a + b), sino a + (b * a) + b. Usted debe tener cuidado de añadir paréntesis alrededor de los elementos cuando sea necesario, mientras que la definición de macros: #define cuadrado (X) ((X) * (X)) es un poco menos arriesgado. (Ian Kemp escribió por primera vez en su comentario)

Se puede utilizar en su lugar una función de plantilla en línea (no menos eficiente en tiempo de ejecución) como la siguiente:

template <class T>
inline T square(T value)
{
    return value*value;
}

Puede comprobar funciona:

int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;

(sin necesidad de escribir

square<int>(++i)

porque el tipo int es implícito para i)

Otros consejos

Debido a que la macro se expande a:

++y * ++y

lo que le da un comportamiento indefinido en C ++ - El resultado podría ser cualquier cosa. Este problema muy conocido debe ser cubierto en cualquier libro de texto decente que cubre el uso de macros. Los cuales uno está usando?

Debido a que las macros hacen sustitución textual por lo que el código que escribió se expandió a

printf("%d\n",++y * ++y );

y luego el orden de las operaciones es un comportamiento indefinido por lo que este el compilador ve incrementos de 2 y luego una multiplicación

Así que tenga cuidado con las macros mejor utilizar las funciones que, como el compilador puede ampliar en línea no tendrán más tiempo para funcionar.

En segundo lugar, no asuma lo que sucederá si incrementar y utilizar variables

Las macros no son funciones: simplemente alteran el texto del programa. Esta operación se denomina preprocesamiento y se ejecuta automáticamente antes de su código se compila. La gente escribe macros para ahorrar su tiempo e introducir cierta variabilidad de su código fuente.

Cuando se escribe SQUARE(x), no hay ninguna llamada Funciton real ocurre, sólo el texto se modifica. El funcionamiento es bastante tonto, por lo que tiene que ver precauciones adicionales en casos como el suyo. Referirse a otras respuestas para explicar su caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top