我最近发现了这个quine
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);
Run Code Online (Sandbox Code Playgroud)
而我无法理解它.我在google/SO上找不到这个特定的解释,所以我希望有人可以向我解释这个东西是如何工作的:-)
此代码由两行组成.
变量赋值:
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';
Run Code Online (Sandbox Code Playgroud)
还有一个printf:
printf($a,39,$a,39,10)
Run Code Online (Sandbox Code Playgroud)
首先让我们学习一些事情printf
.如果您检查的sprintf文件,你会看到printf('%c',39)
将打印的字符39是'
,虽然printf('%c',10)
是一个换行符\n
.要记住的另一件事是printf
获取一个参数列表,这意味着printf('%s%s','foo','bar')
将打印foobar
.
所以现在应该清楚printf($a,39,$a,39,10)
采用格式$a
并执行以下4次转换(等于字符串中的%
符号数$a
)
39
一次出现时使用第二个参数%c
(检查$a
变量),$a
为%s
39
的printf
下一个%c
10
是最后一个%c
这导致了自己的源代码的副本.