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

Cách tái tạo bản thân sau khi biên dịch? Vai trò của việc viết 34 trong hàm printf là gì?Chương trình tự tái tạo

+3

(tiếp tuyến: "khi bị giới hạn sản lượng sai" khi sản lượng được đặt sai) –

+0

Tắt chủ đề: Learn't something something today. Cảm ơn! – ArjunShankar

+0

xin lỗi vì downvoting nhưng tôi nghĩ 34 là hiển nhiên, phải không? – prongs

Trả lời

16

34 là mã ký tự ASCII cho một đúp quote (") nhân vật.


Để theo dõi bình luận tiếp tuyến của tôi (đó là một tham chiếu đến Hofstadter của 'Gödel Escher Bạch'), tác phẩm này bởi vì đó là một quine, về cơ bản là một công thức có chứa hai phần tử: một hạt nhân của dữ liệu và một hoạt động trên hạt nhân đó, sao cho khi hoạt động hoàn tất công thức gốc được sao chép. Trong chương trình bạn đề cập, hạt nhân là chuỗi

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

và hoạt động là phần còn lại của chương trình:

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

nơi ____ là hạt nhân. Bạn sẽ chú ý rằng chúng trông giống hệt nhau: hoạt động có thể tự in bằng cách sử dụng hạt nhân như một trình định dạng định dạng (in hạt nhân nhưng không được trích dẫn, do đó chuyển kernel thành hoạt động trong đầu ra), và cũng tự nạp hạt nhân như một tham số trong định dạng số (%s) và trích dẫn nó, năng suất hạt nhân trong đầu ra.

hoạt động (hạt nhân được trích dẫn) => hạt nhân không được kiểm soát bao gồm bản sao của hạt nhân, được trích dẫn => là chương trình gốc.


một điểm nữa: lý do nó sử dụng 34 doanh nghiệp này là nó giữ hoạt động trích dẫn dễ dàng bằng cách sử dụng hạt nhân không có ký tự trích dẫn; nếu bạn cố gắng sử dụng

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

như hạt nhân, với một hạt nhân không thể viện chứng của

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

nó sẽ được nhiều khó khăn hơn bởi vì để trích hạt nhân, bạn phải xuyệc ngược-escape các dấu ngoặc kép ở giữa chuỗi.

+0

Oh !! thanx, nhưng nó hoạt động như thế nào? –

+2

@Arya: trang này có một lời giải thích hợp lý về cách 'quines' có thể được xây dựng: http://www.madore.org/~david/computers/quine.html Điều đó có thể cung cấp cho bạn một ý tưởng về cách thức hoạt động ở trên. –

+0

thanx cho trang html này ... :) –

Các vấn đề liên quan