程序源代码与其输出完全相同

Imo*_*lis 8 c printf quine output

我越想了解这个困惑的谜,我就越想放弃.

char *s = "char *s = %c%s%c; main(){printf(s,34,s,34);}"; main(){printf(s,34,s,34);}
Run Code Online (Sandbox Code Playgroud)

这个单行源代码如何在程序执行时生成完全相同的输出,这种程序有什么共同的概念吗?

Fil*_*ves 11

这被称为奎因.

那么让我们看看是main()做什么的:

printf(s,34,s,34);
Run Code Online (Sandbox Code Playgroud)

34是字符的ASCII码"(双引号),因此它与:

printf(s, '"', s, '"');
Run Code Online (Sandbox Code Playgroud)

第一个参数printf(3)是格式字符串.传递的字符串是:

"char *s = %c%s%c; main(){printf(s,34,s,34);}"
Run Code Online (Sandbox Code Playgroud)

因此,printf(3)将输出正是这样,但要注意%c,%s%c格式说明,其指示printf(3)打印字符,然后是字符串,然后在那个地方另一个角色,分别是第2,第3和第4个参数.

正如我们所看到的那样,字符都是",字符串也是s(相同的字符串).所以程序输出是:

char *s = "X"; main(){printf(s,34,s,34);}
Run Code Online (Sandbox Code Playgroud)

程序中X的字符串s在哪里.所以我们得到这个作为输出:

char *s = "char *s = %c%s%c; main(){printf(s,34,s,34);}"; main(){printf(s,34,s,34);}
Run Code Online (Sandbox Code Playgroud)

有趣的是,这是程序源本身.