main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
编译后如何复制自己?printf函数中写34有什么作用?
34 是双引号 (") 字符的 ASCII 字符代码。
为了跟进我的切线评论(它是对 Hofstadter 的“Godel Escher Bach”的引用),这是有效的,因为它是一个 quine,它基本上是一个包含两个元素的配方:一个数据内核和对该内核的操作,这样操作完成后,原始配方被复制。为此,内核和操作几乎相同。在您提到的程序中,内核是字符串
"main(a){printf(a=%c%s%c,34,a,34);}"
操作是程序的其余部分:
main(a){printf(a=_____,34,a,34);}
____
内核在哪里。您会注意到它们看起来基本相同:操作可以通过使用内核作为格式说明符来打印自身(打印内核但未引用,从而将内核转换为输出中的操作),并将内核本身作为格式说明符 (the %s
) 中的参数并引用它,在输出中产生内核。
operation(quoted kernel) => 包含内核副本的未引用内核,quoted => 这是原始程序。
还有一点:它使用这个 34 业务的原因是它通过使用没有引号字符的内核使引用操作变得容易;如果您尝试使用
"main(a){printf(a=\"%s\",a);}"
作为内核,带有未引用的内核
main(a){printf(a="%s",a);}
这将更加困难,因为为了引用内核,您必须对字符串中间的引号进行反斜杠转义。