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