Veamos un ejercicio de examen de la Universidad de Washington, con su resolución. En esta oportunidad se busca analizar el código de un programa escrito en C.

✏️ Explicación del código:
Las instrucciones #define se utilizan para crear macros. Una macro es un fragmento de código al que se le da un nombre y, cuando se usa ese nombre, se reemplaza textualmente por el código de la macro.
Las macros de este ejercicio tienen parámetros pero no son exactamente iguales a una función, ya que siempre se hace un reemplazo textual del código.
📍 Es decir que, donde dice FOO(a+b,c), debido a que FOO está definida como FOO(x,y) x + y, entonces x toma el valor de a+b mientras que y toma el valor de c. Haciendo un reemplazo textual nos queda a+b+c. Si a=2, b=3, c=5 finalmente nos queda 2+3+5.
📍 En el caso de BAR(a+b,c), al estar definida como BAR(x,y) y * x, entonces se reemplaza y por 5, mientras que x se reemplaza por 2+3, lo que nos deja con 5*2+3. Teniendo en cuenta la precedencia de los operadores, calculamos (5*2)+3 y nos da 13.
📍 En la última operación, BAR(FOO(a,c),BAR(b,b)), el reemplazo hace que quede BAR(2+5,3*3) que se expande luego a 3*3*2+5, lo cual nos da como resultado 23 (porque se ejecuta primero 3*3*2 y luego a eso se le suman 5).

💻 Ver el código en ejecución
En esta herramienta es posible ver las macros expandidas: hacer click dentro del código y presionar F1, luego buscar allí “Open shell” para abrir la consola shell. En ella, escribir lo siguiente para obtener el código pre-procesado: gcc -E main.c. Para la función main, mostrará algo como lo siguiente:

int main() {
    int a = 2;
    int b = 3;
    int c = 5;
    printf("%d\n", a+b + c);
    printf("%d\n", c * a+b);
    printf("%d\n", b * b * a + c);
    return 0;
}

Ejercicio resuelto de programación en C