许多c++书籍包含这样的示例代码…

std::cout << "Test line" << std::endl;

...所以我也一直这么做。但我看到过很多开发者写的这样的代码:

std::cout << "Test line\n";

是否有技术上的原因,更喜欢其中一个,或者只是编码风格的问题?


当前回答

不是什么大问题,但是endl在boost::lambda中不起作用。

(cout<<_1<<endl)(3); //error

(cout<<_1<<"\n")(3); //OK , prints 3

其他回答

可能存在性能问题,std::endl强制刷新输出流。

它们都将写入适当的行尾字符。除此之外,endl将导致缓冲区被提交。在执行文件I/O时,通常不希望使用endl,因为不必要的提交会影响性能。

不同的行结束字符无关紧要,假设文件以文本模式打开,除非您要求二进制,否则您将得到文本模式。编译后的程序将为被编译的系统写出正确的东西。

唯一的区别是std::endl会刷新输出缓冲区,而'\n'不会。如果不希望频繁刷新缓冲区,请使用'\n'。如果你这样做(例如,如果你想获得所有的输出,而程序是不稳定的),使用std::endl。

这种差异可以用下面的例子来说明:

std::cout << std::endl;

等于

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

So,

使用std::endl如果您想强制立即刷新输出。 如果担心性能问题,请使用\n(如果使用<<操作符,则可能不是这样)。

我在大多数行上使用\n。 然后在段落末尾使用std::endl(但这只是一个习惯,通常不是必需的)。

与其他声明相反,\n字符仅当流去往文件(std::cin和std::cout是特殊的,但仍然是文件(或类文件)时才会映射到行序列的正确平台末端。

这是一个仅输出的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',这被一些来源所鼓励,可能会显著降低输出性能。