C 中的 Quine 程序示例
Quine Program Example in C
在我的课程幻灯片中,我有这个例子,但没有太多解释:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
我明白 quine programs 的一般意思,但我不太明白上面的代码中发生了什么。这是我 运行 得到的输出:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
但它是如何复制自己的代码的?我不太明白输出是如何产生的。
首先以更清晰的方式写出来(除了布局之外不改变任何东西):
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
main()
{
printf(f,34,f,34,10);
}
所以我们看到了一个 main
函数,正如我们所期望的(它应该 return 一个 int
但你可以在 C 中使用 not ;同样对于 no函数参数)。
在那之前,一个普通的字符串。这是一个看起来很有趣的字符串,但它与 char*f="fish";
.
并没有什么不同
好吧,如果我们通过手动将字符串放在那里来扩展 printf
呢?
printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);
我们可以看到它会打印出一些废话,并在此过程中替换一些值。他们是:
First %c : 34 (the ASCII code for " (quotes))
First %s : 'f' (our string, once again)
Second %c : 34 (" again)
Third %c : 10 (the ASCII code for Newline)
让我们也将它们全部替换掉(虽然我已经将字符串的内容替换为 <the string>
,并将 "
替换为 \"
以使其实际作为独立声明工作):
main()
{
printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}
好吧,看看那个! main
简单地打印出我们开始的那一行。万岁!
编辑添加:
虽然我基本上已经为你拼出了答案,但还有一个谜题。自己考虑一下为什么我们费心在 34, f, 34, 10
中进行替换,而不是像我在最终代码中所做的那样将它们直接放入字符串中。
在我的课程幻灯片中,我有这个例子,但没有太多解释:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
我明白 quine programs 的一般意思,但我不太明白上面的代码中发生了什么。这是我 运行 得到的输出:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
但它是如何复制自己的代码的?我不太明白输出是如何产生的。
首先以更清晰的方式写出来(除了布局之外不改变任何东西):
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
main()
{
printf(f,34,f,34,10);
}
所以我们看到了一个 main
函数,正如我们所期望的(它应该 return 一个 int
但你可以在 C 中使用 not ;同样对于 no函数参数)。
在那之前,一个普通的字符串。这是一个看起来很有趣的字符串,但它与 char*f="fish";
.
好吧,如果我们通过手动将字符串放在那里来扩展 printf
呢?
printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);
我们可以看到它会打印出一些废话,并在此过程中替换一些值。他们是:
First %c : 34 (the ASCII code for " (quotes))
First %s : 'f' (our string, once again)
Second %c : 34 (" again)
Third %c : 10 (the ASCII code for Newline)
让我们也将它们全部替换掉(虽然我已经将字符串的内容替换为 <the string>
,并将 "
替换为 \"
以使其实际作为独立声明工作):
main()
{
printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}
好吧,看看那个! main
简单地打印出我们开始的那一行。万岁!
编辑添加:
虽然我基本上已经为你拼出了答案,但还有一个谜题。自己考虑一下为什么我们费心在 34, f, 34, 10
中进行替换,而不是像我在最终代码中所做的那样将它们直接放入字符串中。