2010-04-19 8 views
23
int main(void) 
{ 
    return('yes', *"no", **main, *********printf) ("hello world!\n") *0; 
} 

salidas hello world!, pero ¿cómo funcionan realmente?¿Cómo funciona este "hola mundo!" trabajo del programa?

+2

'return ('yes', *" no ", ** main, ********* printf) (" ¡Es mágico! \ N ") * 0;' Por cierto, lo compilé y realmente funciona ._. – Warty

+0

¡tiene un estilo extraño para escribir software! Nunca recibirá un trabajo para mí. :-) – Oleg

+0

C es realmente un lenguaje pervertido :-) –

Respuesta

46

dos cosas: en realidad

  1. punteros de función no lo hacen eliminar la referencia al igual que otros punteros. *main == main
  2. Una lista separada por comas devuelve el valor del último elemento de la lista

Así que si simplificamos los punteros:

int main(void) 
{ 
    return('yes', *"no", main, printf) ("hello world!\n") *0; 
} 

Y utilizando el último elemento de la lista como el valor de la lista

int main(void) 
{ 
    return printf("hello world!\n") *0; 
} 

printf devuelve el número de caracteres impresos

int main(void) 
{ 
    return 13 *0; 
} 

Y 13 * 0 se deja como ejercicio para el lector.

+10

Su icono de gravatar es extraño, pero sin embargo buena respuesta –

+0

Algunos amigos míos estaban teniendo un concurso de crecimiento de bigote, y tuve que afeitarme. Así que usé un bigote falso ese día. – rampion

+3

+1 para el ejercicio al lector;) –

12
('yes', *"no", **main, *********printf) 

evaluará a *********printf, porque operador coma evalúa sus operandos y devuelve el valor de la última expresión. *********printf es igual a printf, como eliminación de referencias resultados puntero de función en el mismo puntero de función; no hace nada

A continuación, resultado del primer paréntesis, printf, se aplica a ("Hello World! \ N") que se traduce en el texto impreso en la pantalla. La función printf devuelve el número de caracteres escritos. Ese número se multiplica por 0 y el producto es devuelto por la función principal.

Cuestiones relacionadas