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

编译后如何复制自己?printf函数中写34有什么作用?

4

1 回答 1

21

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);}

这将更加困难,因为为了引用内核,您必须对字符串中间的引号进行反斜杠转义。

于 2011-12-21T20:59:14.027 回答