gpt4 book ai didi

c - 这个奎因是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:00 24 4
gpt4 key购买 nike

我刚遇到这个 quine 问题,但没有人真正研究它是如何工作的:C/C++ program that prints its own source code as its output

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}

我特别不明白的是,即使我更改了整数,以下内容也有相同的输出:

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,5,s,11);}

它仍然打印 34s!有人可以一步步引导我完成这个过程吗?

最佳答案

让我们首先格式化代码以跨越多行。这打破了它是奎因的事实,但更容易看出发生了什么:

char* s = "char*s=%c%s%c;main(){printf(s,34,s,34);}";

main() {
printf(s, 34, s, 34);
}

本质上,这是一个字符串 s 的声明,它是一个 printf 格式的字符串,后面跟着一个函数 main 的声明在四个参数上调用 printf。 (main 的定义使用了 C 中老式的“隐式 int”规则,其中假设函数具有 int 作为返回类型,除非另有说明。我相信这在 C 中目前已被弃用,并且肯定知道这不是合法的 C++ 代码。)

那么这个 printf 调用到底在做什么?好吧,注意到 34 是双引号的 ASCII 代码可能会有所帮助,所以行

printf(s, 34, s, 34);

本质上是

printf(s, '"', s, '"');

这意味着“使用参数s 打印字符串s。”那么什么是s?它显示在这里:

char* s = "char*s=%c%s%c;main(){printf(s,34,s,34);}";

这遵循了一个常见的 self 引用技巧。忽略 %c%s%c 部分,这基本上是程序其余部分的字符串表示形式。 %c%s%c 部分出现在它成为自引用的地方。

那么如果调用 printf(s, '"', s, '"') 会发生什么?这将用 "char*s=%c%s%c;main(){printf(s,34,s,34); 填充占位符 %c%s%c }",即字符串s的字符串内容。结合字符串 s 的其余部分,这因此提示

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);";

这是程序的源代码。我认为这有点简洁 - 我所知道的一般 Quine 程序的最接近英文翻译是“打印这个字符串,第二次用引号引起来”(试试看 - 看看会发生什么!),这基本上就是这样做的。

您问的是为什么将数字更改为 5 和 11 并没有改变正在打印的 34。没错!字符串文字 s 中有 34 个硬编码,因此在调用 printf 时更改 5 和 11 不会改变它。它将不再打印字符串 s 内部的引号,而是打印非打印字符。

关于c - 这个奎因是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33534671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com