Recibí una variación de este código C en una entrevista recientemente, y le pregunté qué me devolvería la función.
#define fun(a) a*a int main() { return(fun(4+5)); }
Lo ejecuté con un printf("%d"...)
en lugar de la devolución y se imprime a 29. Ningún otro tipo que “% d” mostró un resultado. ¿Alguien puede explicar lo que está pasando aquí?
a
se expande, no se evalúa como a
. Así que tienes:
4+5*4+5
y con las prioridades del operador; obtienes 4 + 20 + 5 => 29
Mejor manera (con paréntesis externo adicional para proteger contra operadores externos también gracias al comentario de Thomas):
#define fun(a) ((a)*(a))
pero todos los paréntesis del mundo aún no protegen contra i++
, llamadas a funciones (con efectos secundarios, preferiblemente) … así que reusar los argumentos en macros siempre es un problema (tampoco hay syntax para declarar y asignar una variable temporal). Prefiere las funciones en línea en ese caso.