“\ n”或“\ n”或std :: endl到std :: cout?
现在已经很多年了,因为我在写入std::cout
时停止使用std::endl
来结束行,而是开始使用"\n"
。
但是现在我开始看到更多使用'\n'
的代码片段,我开始怀疑什么可能是最好的。
除了显而易见的是一个是string,另一个是字符,使用这个还有什么好处:
std::cout << variable << '\n';
在此:
std::cout << variable << "\n";
其实, '\n'
应该是默认的。 除非你也想显式地刷新数据stream(以及何时和为什么要这么做?),所以根本不需要使用std::endl
。 1
当然,很多书和教程都使用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环境中,如果cout
与STDOUT
同步(这是默认设置)并正在写入terminal,则默认情况下,该stream将被行caching,并且每次写入新行时都会自动刷新。
但是,依靠这种行为是有风险的。 例如在同一个linux环境下,如果你决定运行你的程序, stdout
被redirect到一个文件或者被传送到另一个进程,那么默认情况下,这个stream将被缓冲 。
同样的,如果你以后决定closures与stdio的同步(例如为了提高效率),那么实现将倾向于使用iostream
的缓冲机制,它没有行缓冲模式。
由于这个错误,我看到了很多浪费的生产力。 如果输出在写入时应该是可见的,那么你应该明确地使用std::endl
(或使用std::flush
或std::ostream::flush
,但是我通常会发现std::endl
更方便),或者确保刷新足够经常发生的其他事情,比如将stdout
configuration为行缓冲(假设足够)。
-
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);
将会被使用。 我们可以想象,这个函数将会包含一个循环,我们可能会认为只是打印出一个换行符是矫枉过正的。