“\ n”或“\ n”或std :: endl到std :: cout?

时间:2011-11-29 12:55:08

标签: c++ string character

自从我std::endl写入std::cout后停止使用"\n"结束行并开始使用'\n'时,已经很多年了。

但现在我开始使用std::cout << variable << '\n'; 看到更多代码片段,我开始想知道什么是最好的。

除了明显的一个是字符串,另一个是字符外,使用它还有什么好处:

std::cout << variable << "\n";

通过这个:

'\n'

迟到:

当我问这个问题时,我似乎认为换行符std::cin刷新了缓冲区。现在我知道取决于

默认情况下,stdin与旧的C FILE* std::cout流绑定,stdoutstdout绑定。新线上的冲洗来自这种搭售。默认情况下,std::cout如果连接到终端,则进行行缓冲。这意味着新行将刷新其缓冲区。因此,使用stdout打印换行符时,会导致stdout被刷新。

如果std::cout未连接到终端(例如,输出已被重定向或通过管道传输),或者stdout和{{1}}之间的关系被破坏,那么换行符将会没有冲洗任何东西。

6 个答案:

答案 0 :(得分:97)

实际上,'\n'应该是默认值。除非您还要显式刷新流(以及何时以及为什么要这样做?),根本不需要使用std::endl 1
当然,许多书籍和教程都使用std::endl作为默认值。这是不幸的,可能导致serious performance bugs

我认为使用'\n'或使用"\n"之间没有什么区别,但后者是(两个)字符的数组,必须逐字符打印,循环必须为设置,这比输出单个字符更复杂。当然,在执行IO时这很重要,但如果有疑问,当您想输出一个字符文字时,输出一个字符文字,而不是整个字符串文字。
这样做的一个很好的副作用是,您在代码中传达预期只输出一个字符,而不是偶然地做到这一点。


1 请注意,默认情况下std::coutstd::cin绑定,导致std::cout在任何输入操作之前被刷新,以便在用户输入内容之前打印任何提示。

答案 1 :(得分:14)

没有最好的。你使用你需要的东西:

  • '\ n' - 结束行
  • “some string \ n” - 在一些字符串后面的行结束
  • std::endl - 结束行并刷新流

答案 2 :(得分:14)

他们做不同的事情。 "\n"输出换行符(在适当的平台特定表示中,因此它在Windows上生成"\r\n"),但std::endl执行相同的并刷新流 。通常情况下,您不需要立即刷新流,而只会降低性能,因此大多数情况下都没有理由使用std::endl

答案 3 :(得分:4)

编辑:我的答案很糟糕,这可能会让人们相信我认为“\ n”实际上是打印了一个空字符。这当然是错误的:)

编辑2:看过C ++引用后,无论如何都会通过引用传递char,所以没有区别。唯一的区别是必须在cstring中搜索分隔符。 由于这一事实,以下内容不正确。

'\n'的效率会比"\n"略高,因为后者在末尾也包含空字符,这意味着您要向{{1}发送char* (通常是32位系统上的4个字节),而不是operator<<()的单个字节。

在实践中,这是无关紧要的。就个人而言,我遵循弗拉基米尔概述的惯例。*

答案 4 :(得分:3)

std::endl刷新流。当你想要发生这件事时 - 例如因为您希望您的输出能够及时对用户可见 - 您应该使用std::endl而不是将'\n'写入流中(无论是作为孤立的字符还是字符串的一部分)。

有时候,你可以在没有明确地自己冲洗流的情况下离开;例如在linux环境中,如果coutSTDOUT同步(这是默认设置)并且正在写入终端,则默认情况下,流将行缓冲并且每次写新行时都会自动刷新。

然而,依赖这种行为是有风险的。例如在相同的Linux环境中,如果您决定运行程序,stdout被重定向到文件或通过管道传输到另一个进程,则默认情况下,该流将阻止缓冲。< / p>

同样,如果您以后决定关闭与stdio的同步(例如,为了效率),那么实现将倾向于使用iostream的缓冲机制,它没有行缓冲模式。

由于这个错误,我已经看到了很多浪费的生产力;如果输出在写入时应该是可见的,那么您应该明确使用std::endl(或使用std::flushstd::ostream::flush,但我通常会发现std::endl更方便),或者做一些确保经常发生冲洗的事情,例如将stdout配置为行缓冲(假设足够)。

答案 5 :(得分:3)

  • std::cout << variable << std::endl;

    std::endl输出换行符,但它也会刷新输出流。换句话说,效果与

    相同
    std::cout << variable << '\n'; // output newline
    std::cout.flush();      // then flush 
    
  • std::cout << variable << '\n';

    '\n'输出char,的换行符,因此会使用ostream& operator<< (ostream& os, char c);

  • std::cout << variable << "\n";

    "\n"const char[2],因此将使用ostream& operator<< (ostream& os, const char* s);。我们可以想象,这个函数将包含一个循环,我们可能认为只是打印出一个新行太过分了。