with macro functions ejemplo define c macros preprocessor-directive

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 ); }