functions - C extraña sintaxis macro
define max en c (1)
Encontré este ejemplo de código C, y estoy absolutamente desconcertado:
#include <stdio.h>
#define M(a,b) a%:%:b
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", M(a,b)<:a:> );
printf( "%d", M(a,b)<:a:>?a:b );
printf( "%d", c=M(a,b)<:a:>?a:b );
}
¿Podría alguien explicar lo que se supone que debe hacer? Ni siquiera se compila en Visual Studio, pero lo publiqué en línea (en ideone.com ) e imprimí el 2011
, lo que también contribuyó a la confusión.
Está haciendo uso de dígrafos C que fueron enmiendas a la norma C en 1994 y, por lo tanto, parte de la norma C99. Al intercambiar los dígrafos con sus personajes reales, obtienes:
#include <stdio.h>
#define M(a,b) a##b
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", M(a,b)[a] );
printf( "%d", M(a,b)[a]?a:b );
printf( "%d", c=M(a,b)[a]?a:b );
}
Por lo tanto, tenga en cuenta que a##b
combinará la entrada en un solo identificador. Dado que la macro acaba de pasar a
y b
, el resultado es solo ab
, por lo que efectivamente tiene:
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", c=ab[a]?a:b );
}
La asignación a c
no es realmente relevante, así que podemos deshacernos de eso:
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", ab[a]?a:b );
}
Ahora, deshacámonos del operador ternario ( ?:
, Porque podemos resolverlo de forma estática ( ab[a]
siempre es cierto porque a
es 1 y ab[1]
es 20, es decir, no es cero):
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", a );
printf( "%d", a );
}
Ahora, reemplace las variables con sus valores reales, es decir, ab[a]
con 20
y a
con 1
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", 20 );
printf( "%d", 1 );
printf( "%d", 1 );
}