2011-12-21 10 views
9
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);} 

¿Cómo se reproduce después de la compilación? ¿Cuál es la función de escribir 34 en la función printf?Programa de auto reproducción

+3

(tangente: "cuando quined produce falsedad" cuando quined produce falsedad) –

+0

Fuera de tema: Aprende algo interesante hoy. ¡Gracias! – ArjunShankar

+0

siento por la votación negativa, pero creo que 34 es obvio, ¿no? – prongs

Respuesta

16

34 es el código de caracteres ASCII para una comilla doble (") carácter.


Para dar seguimiento a mi comentario tangencial (que era una referencia a la de Hofstadter 'Gödel Escher Bach'), esto funciona porque es una quine, que básicamente es una receta que contiene dos elementos: un kernel de datos y una operación en ese kernel, de modo que cuando la operación se completa se reproduce la receta original. Para hacerlo, el kernel y la operación son casi idénticos . En el programa que menciona, el kernel es la cadena

"main(a){printf(a=%c%s%c,34,a,34);}" 

y la operación es el resto del programa:

main(a){printf(a=_____,34,a,34);} 

donde ____ es el núcleo. Observará que se ven esencialmente iguales: la operación puede imprimirse utilizando el kernel como un especificador de formato (que imprime el kernel pero sin comillas, transformando así el kernel en la operación en la salida), y también alimentando el núcleo en sí mismo como un parámetro en el especificador de formato (%s) y lo cita, produciendo el kernel en la salida.

operación (kernel citado) => núcleo sin comillas que incluye una copia del kernel, citado => que es el programa original.


un punto más: la razón por la que utiliza este negocio 34 es que mantiene la operación citando fácil mediante el uso de un núcleo sin comillas; si se trató de utilizar

"main(a){printf(a=\"%s\",a);}" 

como el núcleo, con un kernel sin comillas de

main(a){printf(a="%s",a);} 

que sería mucho más difícil porque a fin de citar el núcleo, que tendría que barra invertida de escape las comillas en el medio de la cadena.

+0

¡¡Oh !! Gracias, pero ¿cómo está funcionando? –

+2

@Arya: esta página tiene una explicación decente de cómo se puede construir 'quines': http://www.madore.org/~david/computers/quine.html Eso podría darte una idea de cómo funciona lo anterior. –

+0

Gracias por esta página html ... :) –

Cuestiones relacionadas