我最近发现了这个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为%s39的printf下一个%c10是最后一个%c这导致了自己的源代码的副本.