许多c++书籍包含这样的示例代码…
std::cout << "Test line" << std::endl;
...所以我也一直这么做。但我看到过很多开发者写的这样的代码:
std::cout << "Test line\n";
是否有技术上的原因,更喜欢其中一个,或者只是编码风格的问题?
许多c++书籍包含这样的示例代码…
std::cout << "Test line" << std::endl;
...所以我也一直这么做。但我看到过很多开发者写的这样的代码:
std::cout << "Test line\n";
是否有技术上的原因,更喜欢其中一个,或者只是编码风格的问题?
当前回答
我从来没见过有人说“\n”会受到cout格式的影响:
#include <iostream>
#include <iomanip>
int main() {
std::cout << "\\n:\n" << std::setw(2) << std::setfill('0') << '\n';
std::cout << "std::endl:\n" << std::setw(2) << std::setfill('0') << std::endl;
}
输出:
\n:
0
std::endl:
注意,由于'\n'是一个字符,填充宽度设置为2,因此在'\n'之前只打印了1个0。
我在任何地方都找不到关于它的任何东西,但它会用clang, gcc和msvc复制。
我第一次看到它的时候非常困惑。
其他回答
这是一个仅输出的I/O操纵器。
std::endl将一个换行符插入到输出序列os中并将其刷新,就像调用os.put(os. width ('\n'))然后再调用os.flush()一样。
使用时间:
这个机械手可以用来立即产生一行输出,
如。
当显示来自长时间运行的进程、多个线程的日志活动或可能意外崩溃的程序的日志活动的输出时。
Also
如果派生进程执行任何屏幕I/O,则在调用std::system之前还需要显式刷新std::cout。在大多数其他常见的交互式I/O场景中,std::endl与std::cout一起使用时是冗余的,因为std::cin的任何输入、std::cerr的输出或程序终止都会强制调用std::cout.flush()。使用std::endl来代替'\n',这被一些来源所鼓励,可能会显著降低输出性能。
如果您同时使用Qt和endl,您可能会意外地使用不正确的endl,从而得到非常令人惊讶的结果。请看下面的代码片段:
#include <iostream>
#include <QtCore/QtCore>
#include <QtGui/QtGui>
// notice that there is no "using namespace std;"
int main(int argc, char** argv)
{
QApplication qapp(argc,argv);
QMainWindow mw;
mw.show();
std::cout << "Finished Execution!" << endl;
// This prints something similar to: "Finished Execution!67006AB4"
return qapp.exec();
}
注意,我写了endl而不是std::endl(这将是正确的),显然有一个endl函数定义在qtextstream.h(这是QtCore的一部分)。
使用“\n”而不是endl完全避免了任何潜在的名称空间问题。 这也是一个很好的例子,说明为什么把符号放到全局命名空间(就像Qt默认做的那样)是一个坏主意。
可能存在性能问题,std::endl强制刷新输出流。
它们都将写入适当的行尾字符。除此之外,endl将导致缓冲区被提交。在执行文件I/O时,通常不希望使用endl,因为不必要的提交会影响性能。
如果你要使用std::endl,这里隐含了另一个函数调用
a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;
A)呼叫操作员<<一次。 B)呼叫操作员<<两次。