es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Motivo de la diferencia entre (macro +1) y (1 + macro)

Se agrega una macro (ver más abajo) para devolver el número más grande de dos números agregados por 1. Pero, el efecto de la adición está ausente.

PS: También he verificado agregando paréntesis excesivos a la macro.

#define max(a,b) (a >= b ? a : b);

void main(){
    int result = max(5,10) + 1; //result = 10
}

Soluciones:
CASO 1:
Al reemplazar manualmente la macro en la expresión (como lo hace el preprocesador, creo), la adición se realiza correctamente.

result = (5 >= 10 ? 5 : 10) + 1;  // Se evalúa correctamente como 11.

CASO 2:
La expresión también se evalúa correctamente cuando se invierte el orden de los operandos.

result = 1 + max(5,10); // Se evalúa correctamente como 11.

¿Por qué la expresión original no funciona como se pretendía mientras que los dos casos de solución sí lo hacen?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La macro original no funciona como se intentaba debido a la presencia de un punto y coma al final de su definición. La macro se expande a (a>=b ? a : b); con el punto y coma, lo que significa que se evalúa la expresión primero y luego el punto y coma la termina. Como resultado, cualquier operación posterior como la adición en el caso de result = max(5, 10) + 1; no se incorpora a la expansión de la macro.

    Para solucionar esto, el punto y coma debe eliminarse de la definición de la macro de esta manera:

    #define max(a,b) (a >= b ? a : b)
    

    Con esta macro corregida, la expresión result = max(5, 10) + 1; ahora se evaluará correctamente a 11.

Comments are closed.