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

现在已经很多年了,因为我在写入std::cout时停止使用std::endl来结束行,而是开始使用"\n"

但是现在我开始看到更多使用'\n'的代码片段,我开始怀疑什么可能是最好的。

除了显而易见的是一个是string,另一个是字符,使用这个还有什么好处:

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

在此:

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

其实, '\n'应该是默认的。 除非你也想显式地刷新数据stream(以及何时和为什么要这么做?),所以根本不需要使用std::endl1
当然,很多书和教程都使用std::endl作为默认值。 这是不幸的,可能会导致严重的性能错误 。

我认为使用'\n'或使用"\n"几乎没有区别,但是后者是一个(两个)字符的数组,必须逐个字符地打印,为此必须设置一个循环比输出单个字符更复杂。 当然,在做IO的时候这很less有问题,但是如果有疑问,当你想输出一个字符时,输出一个字符,而不是整个string。
这样做的一个好的副作用是你在你的代码中进行通信,你只想输出一个字符,而不是偶然地做到这一点。


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

他们做不同的事情。 "\n"输出一个换行符(在适当的特定于平台的表示forms中,所以它会在Windows上生成一个"\r\n" ),但是std::endl会执行相同的操作并刷新stream 。 通常情况下,你不需要立即刷新数据stream,只需花费你的性能,所以大多数情况下没有理由使用std::endl

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

  • '\ n' – 结束该行
  • “一些string\ n” – 一些string后的行结束
  • std::endl – 结束行并刷新stream

编辑:我的回答差劲,这可能导致人们相信我认为“\ n”实际上打印出一个空字符。 这当然是错误的:)

编辑2:看了一个C ++的引用, char无论如何都是通过引用传递的,所以在这里没有任何区别。 唯一的区别是,必须searchcstring分隔字符。 以下是不正确的,由于这个事实。

'\n''\n'稍微有效一些,因为后者在结尾还包含一个空字符,这意味着你发送了一个char*operator<<() (通常是4个字节32位系统),而不是char的单个字节。

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

std::endl刷新stream。 当你想要发生的事情 – 例如,因为你期望你的输出以及时的方式显示给用户 – 你应该使用std::endl而不是写stream'\n' (不pipe是作为一个孤立的字符或string的一部分)。

有时候,你可以逃避,而不必自己清理stream。 例如,在Linux环境中,如果coutSTDOUT同步(这是默认设置)并正在写入terminal,则默认情况下,该stream将被行caching,并且每次写入新行时都会自动刷新。

但是,依靠这种行为是有风险的。 例如在同一个linux环境下,如果你决定运行你的程序, stdout被redirect到一个文件或者被传送到另一个进程,那么默认情况下,这个stream将被缓冲

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

由于这个错误,我看到了很多浪费的生产力。 如果输出在写入时应该是可见的,那么你应该明确地使用std::endl (或使用std::flushstd::ostream::flush ,但是我通常会发现std::endl更方便),或者确保刷新足够经常发生的其他事情,比如将stdoutconfiguration为行缓冲(假设足够)。

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

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

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

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

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

    "\n"是一个const char[2] ,所以ostream& operator<< (ostream& os, const char* s); 将会被使用。 我们可以想象,这个函数将会包含一个循环,我们可能会认为只是打印出一个换行符是矫枉过正的。