为什么“std::cout << char() << std::endl;”甚至没有在编译器资源管理器上打印新行?

Why does "std::cout << char() << std::endl;" not even print a new line on Compiler Explorer?

提问人:Enlico 提问时间:8/13/2023 最后编辑:Remy LebeauEnlico 更新时间:8/13/2023 访问量:173

问:

此代码:

#include <iostream>

int main() {
    std::cout << "---" << std::endl;
    std::cout << char() << std::endl;
    std::cout << "---" << std::endl;
}

打印以下内容:

---
---

为什么不在其他两个之间产生一条新行?std::endl

删除使输出成为我所期望的:char() <<

---

---
C++ IOSTREAM 换行符 cout compiler-explorer

评论

5赞 user17732522 8/13/2023
这将是您的终端的解释。输出中有一个空字符,我认为终端应该将其作为不可打印的字符忽略,但我怀疑这在任何地方都是标准化的。你在看什么终端?
1赞 jabaa 8/13/2023
它可以在 godbolt 上重现:godbolt.org/z/nfEcEPx6z
1赞 user17732522 8/13/2023
不过@jabaa GCC 仍然在 stdout 上生成 null 字符和换行符。编译器资源管理器上的演示文稿会跳过它。这很容易发生,甚至是无意的,例如,如果呈现代码中的某些内容单独处理每一行,意外地作为以 null 结尾的字符串。
1赞 jabaa 8/13/2023
奇怪。我试过用 和 .全部打印换行符。我只能在编译器资源管理器上重现它。您的实际环境是什么?shbashzsh
2赞 jabaa 8/13/2023
这似乎不是关于C++的问题,而是关于编译器资源管理器如何打印输出的问题。它是开源的:github.com/compiler-explorer/compiler-explorer

答:

4赞 user17732522 8/13/2023 #1

该代码将导致标准库将空字符后跟换行符打印到流中。

如何呈现这些字符取决于您用于查看流内容的终端或其他 UI。

我通常希望终端跳过 null 字符作为不可打印,并像往常一样解释换行符。但是,我认为没有任何标准或规范要求这种行为。

在这个具体案例中,我怀疑编译器资源管理器如何呈现输出存在错误,可能是在基于 https://github.com/rburns/ansi-to-html 的 AnsiToHtml 中,用于格式化包含 ANSI 转义代码的编译器的输出。该库对输入进行了一些标记化,因此此类错误似乎并非不可能,但是我没有足够的JavaScript / TypeScript来快速浏览一下。