main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
编译后它是如何自我复制的?在printf函数中,写作34的作用是什么?
34是双引号(")字符的ASCII字符码。
跟进我的切题评论(这是对霍夫施塔特的"哥德尔·埃舍尔·巴赫"的参考),这是有效的,因为它是一个奎因,它基本上是一个包含两个元素的配方:数据内核和对内核的操作,这样当操作完成时,原始配方被复制。要做到这一点,内核和操作几乎完全相同。在你提到的程序中,内核是字符串
"main(a){printf(a=%c%s%c,34,a,34);}"
,操作是程序的其余部分:
main(a){printf(a=_____,34,a,34);}
,其中____
为内核。您会注意到它们看起来本质上是相同的:操作可以通过使用内核作为格式说明符(打印内核但不加引号,从而将内核转换为输出中的操作)来打印自身,也可以将内核本身作为格式说明符(%s
)的参数提供并引用它,从而在输出中生成内核。
operation(带引号的kernel) =>包含内核副本的未加引号的kernel,带引号的=>是原始程序。
还有一点:它使用这个34业务的原因是它通过使用一个没有引号字符的内核来保持引号操作的简单;如果你试图使用
"main(a){printf(a="%s",a);}"
作为内核,内核不带引号
main(a){printf(a="%s",a);}
则要困难得多,因为为了引用内核,您必须对字符串中间的引号进行反斜杠转义。