自从我std::endl
写入std::cout
后停止使用"\n"
结束行并开始使用'\n'
时,已经很多年了。
但现在我开始使用std::cout << variable << '\n';
看到更多代码片段,我开始想知道什么是最好的。
除了明显的一个是字符串,另一个是字符外,使用它还有什么好处:
std::cout << variable << "\n";
通过这个:
'\n'
迟到:
当我问这个问题时,我似乎认为换行符std::cin
刷新了缓冲区。现在我知道取决于。
默认情况下,stdin
与旧的C FILE*
std::cout
流绑定,stdout
与stdout
绑定。新线上的冲洗来自这种搭售。默认情况下,std::cout
如果连接到终端,则进行行缓冲。这意味着新行将刷新其缓冲区。因此,使用stdout
打印换行符时,会导致stdout
被刷新。
如果std::cout
未连接到终端(例如,输出已被重定向或通过管道传输),或者stdout
和{{1}}之间的关系被破坏,那么换行符将会没有冲洗任何东西。
答案 0 :(得分:97)
实际上,'\n'
应该是默认值。除非您还要显式刷新流(以及何时以及为什么要这样做?),根本不需要使用std::endl
。 1
当然,许多书籍和教程都使用std::endl
作为默认值。这是不幸的,可能导致serious performance bugs。
我认为使用'\n'
或使用"\n"
之间没有什么区别,但后者是(两个)字符的数组,必须逐字符打印,循环必须为设置,这比输出单个字符更复杂。当然,在执行IO时这很重要,但如果有疑问,当您想输出一个字符文字时,输出一个字符文字,而不是整个字符串文字。
这样做的一个很好的副作用是,您在代码中传达预期只输出一个字符,而不是偶然地做到这一点。
1 请注意,默认情况下std::cout
与std::cin
绑定,导致std::cout
在任何输入操作之前被刷新,以便在用户输入内容之前打印任何提示。
答案 1 :(得分:14)
没有最好的。你使用你需要的东西:
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环境中,如果cout
与STDOUT
同步(这是默认设置)并且正在写入终端,则默认情况下,流将行缓冲并且每次写新行时都会自动刷新。
然而,依赖这种行为是有风险的。例如在相同的Linux环境中,如果您决定运行程序,stdout
被重定向到文件或通过管道传输到另一个进程,则默认情况下,该流将阻止缓冲。< / p>
同样,如果您以后决定关闭与stdio的同步(例如,为了效率),那么实现将倾向于使用iostream
的缓冲机制,它没有行缓冲模式。
由于这个错误,我已经看到了很多浪费的生产力;如果输出在写入时应该是可见的,那么您应该明确使用std::endl
(或使用std::flush
或std::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);
。我们可以想象,这个函数将包含一个循环,我们可能认为只是打印出一个新行太过分了。