OT: Pregunta de C

Horst von Brand vonbrand en inf.utfsm.cl
Lun Nov 22 14:46:30 CLST 2004


Daniel Serpell <daniel_serpell en yahoo.com> dijo:

[...]

> Aunque no lo creas, todo compilador de C compatible con el estándar debe
> tragarse lo siguiente, e incluso generar código válido:
> 
> h(i) {
>  return i["0123456789ABCDEF"];

Obvio. a[i] == *(a + i) == *(i + a) == i[a]. Aca 'a' es el arreglo de
caracteres (el string). Menos enredado es:

   return "0123456789ABCDEF"[i];

que hace exactamente lo mismo (y es igual de misterioso para el newbie ;-)

> }
> 
> char p[5];
> char *hh(i) {
>  p[4] = 0;
>  p[3] = h(i&15);
>  p[2] = h((i>>=4)&15);
>  p[1] = h((i>>=4)&15);
>  p[0] = h((i>>=4)&15);
>  return p;

Retorna el arreglo global 'p', que "magicamente" se transforma en puntero a
su 0-esimo elemento cuando se le mira de frente. Como p[4] == '\0', esto es
un string valido. La magia tonteando con bits transfiere 'i' un digito
hexadecimal a la vez a 'p'.

> }
> 
> main() {
>  int puts(char *);
>  puts(hh(getpid()));
> }
> 
> Tarea para la casa: ¿por qué funciona?.

Otra tarea: En que maquinas _no_ funciona? Porque?

Que lindo es C...

Busquen ganadores del Obfuscated C Contest para algunas joyitas.
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513


Más información sobre la lista de distribución Linux