微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自我复制程序

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

编译后如何复制?在printf函数中写作34的作用是什么?

解决方法

34是双引号(“”)字符的ASCII字符代码.

为了跟进我的切向评论(这是Hofstadter的“Godel Escher Bach”的引用),这是因为它是一个quine,它基本上是一个包含两个元素的配方:内核的数据内核和操作的内核,当操作完成时,原始配方被复制.为此,内核和操作几乎相同.在你提到的程序中,内核是字符串

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

操作是程序的其余部分:

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

其中____是内核.您会注意到它们看起来基本相同:操作可以通过使用内核作为格式说明符(打印内核但不引用,从而将内核转换为输出中的操作)打印本身,还可以将内核自身作为格式说明符(%s)中的一个参数,并引用它,产生输出中的内核.

操作(引用的内核)=>未引用的内核,包含内核的副本,引用=>这是原来的程序.

还有一点:它使用这个34业务的原因是它通过使用没有引号的内核来保持引用操作的容易;如果你试图使用

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

作为内核,具有无引号的内核

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

这将会更加困难,因为为了引用内核,你必须反斜杠转义字符串中间的引号.

原文地址:https://www.jb51.cc/c/113086.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐