Hea*_*eek 530 c++ iostream coding-style c++-faq
许多C++书籍都包含这样的示例代码......
std::cout << "Test line" << std::endl;
......所以我也一直这样做.但我已经看到很多来自像这样的开发人员的代码:
std::cout << "Test line\n";
是否有技术上的理由偏爱另一个,或者仅仅是编码风格的问题?
Dav*_*ley 450
假设文件在文本模式下打开,变化的行尾字符无关紧要,除非你要求二进制文件,否则这是你得到的.编译好的程序会为编译的系统写出正确的东西.
唯一的区别是std::endl刷新输出缓冲区,而'\n'不是.如果您不希望频繁刷新缓冲区,请使用'\n'.如果您这样做(例如,如果您想获得所有输出,并且程序不稳定),请使用std::endl.
Mar*_*ork 229
差异可以通过以下说明:
std::cout << std::endl;
相当于
std::cout << '\n' << std::flush;
所以,
std::endl如果要强制立即刷新输出.\n如果您担心性能,请使用(如果您使用的是<<运营商,则可能不是这种情况).我用\n在大多数线上.
然后std::endl在段落的末尾使用(但这只是一种习惯,通常不是必需的).
与其他声明相反,\n只有当流转到文件(std::cin并且std::cout是特殊但仍然是文件(或类似文件))时,字符才会映射到正确的行序列末尾.
Emi*_* L. 26
我记得在标准中读过这个,所以这里是:
请参阅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.
小智 25
如果您要使用,那里还有另一个隐含的函数调用 std::endl
a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;
a)调用<<一次操作员.
b)呼叫运营商<<两次.
Özg*_*gür 11
没什么大不了的,但是endl在boost :: lambda中不起作用.
(cout<<_1<<endl)(3); //error
(cout<<_1<<"\n")(3); //OK , prints 3
Pio*_*ski 10
我从未见过有人说过'\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'是 1 个字符且填充宽度设置为 2,因此在 之前仅打印 1 个零'\n'。
我在任何地方都找不到有关它的任何信息,但它可以用 clang、gcc 和 msvc 重现。
当我第一次看到它时我非常困惑。
如果你使用Qt和endl,你可能会意外地使用错误endl,今天发生在我身上,我就像..WTF ??
#include <iostream>
#include <QtCore/QtCore> 
#include <QtGui/QtGui>
//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如果你有一个usingfor std::cout或者命名空间std,C++会选择正确的,因为std::endl它与std::coutC++的ADL机制将选择相同的命名空间std::endl.
参考这是一个仅输出的 I/O 操纵器。
std::endl将换行符插入到输出序列 os 中并刷新它,就像通过调用os.put(os.widen('\n'))后跟os.flush().
何时使用:
该操纵器可用于立即产生一行输出,
例如
当显示长时间运行的进程的输出时,记录多个线程的活动或记录可能意外崩溃的程序的活动。
还
如果生成的进程执行任何屏幕 I/O,则在调用 std::system 之前还需要显式刷新 std::cout。在大多数其他常见的交互式 I/O 场景中,std::endl 与 std::cout 一起使用时是多余的,因为来自 std::cin 的任何输入、输出到 std::cerr 或程序终止都会强制调用 std::cout .flush()。在某些来源的鼓励下,使用 std::endl 代替 '\n' 可能会显着降低输出性能。
| 归档时间: | 
 | 
| 查看次数: | 180125 次 | 
| 最近记录: |