许多C++书籍都包含这样的示例代码......
std::cout << "Test line" << std::endl;
......所以我也一直这样做.但我已经看到很多来自像这样的开发人员的代码:
std::cout << "Test line\n";
是否有技术上的理由偏爱另一个,或者仅仅是编码风格的问题?
假设文件在文本模式下打开,变化的行尾字符无关紧要,除非你要求二进制文件,否则这是你得到的.编译好的程序会为编译的系统写出正确的东西.
唯一的区别是std::endl
刷新输出缓冲区,而'\n'
不是.如果您不希望频繁刷新缓冲区,请使用'\n'
.如果您这样做(例如,如果您想获得所有输出,并且程序不稳定),请使用std::endl
.
差异可以通过以下说明:
std::cout << std::endl;
相当于
std::cout << '\n' << std::flush;
所以,
使用std::endl
如果要强制立即刷新输出.
\n
如果您担心性能,请使用(如果您使用的是<<
运营商,则可能不是这种情况).
我用\n
在大多数线上.
然后std::endl
在段落的末尾使用(但这只是一种习惯,通常不是必需的).
与其他声明相反,\n
只有当流转到文件(std::cin
并且std::cout
是特殊但仍然是文件(或类似文件))时,字符才会映射到正确的行序列末尾.
可能存在性能问题,std::endl
强制刷新输出流.
我记得在标准中读过这个,所以这里是:
请参阅C11标准,该标准定义了标准流的行为方式,因为C++程序与CRT接口,C11标准应该在此处管理刷新策略.
ISO/IEC 9899:201x
7.21.3§7
在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出).最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
7.21.3§3
当流未缓冲时,字符应尽快从源或目的地出现.否则,可以将字符作为块累积并发送到主机环境或从主机环境发送.当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输.当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输.此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境. .对这些特性的支持是实现定义的,可能会受到setbuf和setvbuf函数的影响.
这意味着,std::cout
和std::cin
是完全缓冲当且仅当他们所指的非交互设备.换句话说,如果stdout附加到终端,则行为没有差异.
但是,如果std::cout.sync_with_stdio(false)
被调用,那么'\n'
即使交互设备也不会导致刷新.否则'\n'
相当于std::endl
除非管道到文件:c ++ ref on std :: endl.
如果您要使用,那里还有另一个隐含的函数调用 std::endl
a) std::cout << "Hello\n"; b) std::cout << "Hello" << std::endl;
a)调用<<
一次操作员.
b)呼叫运营商<<
两次.
他们都会写出适当的行尾字符.除此之外,endl将导致缓冲区被提交.您通常不希望在执行文件I/O时使用endl,因为不必要的提交会影响性能.
没什么大不了的,但是endl在boost :: lambda中不起作用.
(cout<<_1<
8> smerlin..:如果你使用Qt和endl,你可能会意外地使用错误
endl
,今天发生在我身上,我就像..WTF ??#include#include #include //notice that i dont have a "using namespace std;" int main(int argc, char** argv) { QApplication qapp(argc,argv); QMainWindow mw; mw.show(); std::cout << "Finished Execution !" << endl << "..."; // Line above printed: "Finished Execution !67006AB4..." return qapp.exec(); } 当然这是我的错,因为我应该写
std::endl
,但如果你使用*endl
,qt,using namespace std;
它取决于包含文件的顺序,如果正确endl
使用.当然,您可以重新编译Qt以使用命名空间,因此您会收到上述示例的编译错误.
编辑:忘记提及,Qt
endl
是在"qtextstream.h"中声明的,它是QtCore的一部分*EDIT2:
endl
如果你有一个using
forstd::cout
或者命名空间std
,C++会选择正确的,因为std::endl
它与std::cout
C++的ADL机制将选择相同的命名空间std::endl
.
Urgh!谁会想要`使用命名空间std;`?? :-)
讨厌.感谢您的评论,我相信其他人会遇到这个问题.