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

編譯後如何自我複製?在printf函數中寫入34的作用是什麼?自我複製程序

+3

(切線:「當奎因產生虛假時,錯誤產生謊言) – 2011-12-21 20:58:58

+0

偏題:今天學習一些有趣的事情。謝謝! – ArjunShankar 2011-12-22 09:32:14

+0

對於downvoting感到抱歉,但我認爲34是顯而易見的,不是嗎? – prongs 2012-08-21 14:18:53

回答

16

34是一個雙引號(「)的字符的ASCII碼字符。


在我切評論跟進(這是霍夫斯塔特的參考‘哥德爾艾舍爾巴赫’),該作品因爲它是一個quine,它基本上是一個包含兩個元素的配方:一個數據核和一個對該內核的操作,這樣當操作完成時,原始配方被再現。爲此,內核和操作幾乎完全相同在你提到的程序中,內核是字符串

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

和操作的程序的其餘部分:

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

其中____是內核。您會注意到它們看起來基本相同:操作可以通過使用內核作爲格式說明符(打印內核但未加引號,從而將內核轉換爲輸出中的操作)打印自身,並且還將內核本身作爲格式說明符(%s)中的一個參數並引用它,在輸出中產生內核。

操作(引用的內核)=>包含內核副本的未引用內核,quoted =>這是原始程序。


還有一點:它使用這34個業務的原因是它通過使用不帶引號字符的內核來保持引用操作容易;如果你試圖使用

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

內核,與

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

帶引號的內核將變得更加困難,因爲以引用的內核,你必須反斜槓轉義字符串中間的引號。

+0

哦! thanx,但它是如何工作的? – 2011-12-21 21:08:12

+2

@Arya:這個頁面對如何構建「奎因斯」有一個體面的解釋:http://www.madore.org/~david/computers/quine.html這可能讓你瞭解上述工作原理。 – 2011-12-21 21:20:02

+0

thanx爲這個html頁面:) :) – 2011-12-21 21:39:23