std::endl 和 '\n' 有什么区别

What's the difference between std::endl and '\n'

我读过 std::endl'\n' 之间的区别是 std::endl 刷新缓冲区而 '\n' 不刷新缓冲区。但是,据我所知 linux 上的 stdout 无论如何都是行缓冲的,所以这是否意味着 std::cout << ... << std::endlstd::cout << ... << '\n' 相同?

这个std::cout << ... << std::endl和这个std::cout << ... << '\n'不完全一样。在最后一个中,换行符 \n 被流式传输到输出。在大多数情况下,这将被控制台解释为换行符。但是 std::endl 意味着(正如你已经提到的)在输出控制台中完全刷新和换行。

假设您将其写在文档中。在 Linux 中 \n 就足够了。但是 Windows 期望 \r\n。因此,使用 \n 不会出现新行,例如Windows.

中的记事本++
std::ostream os;

os << std::endl; // more concise

os << '\n' << std::flush; // more explicit about flushing

这两行的效果完全一样。

手动冲洗往往是浪费时间:

  • 如果输出流是line-buffered,如果它连接到交互式终端std::cout应该是这种情况该实现可以检测到,然后打印 \n 已经刷新。

  • 如果输出流与您之后直接读取的输入流配对(std::coutstd::cin 配对),则读取已经刷新。

  • 如果没有人等待数据到达目的地,刷新又是浪费。