为了账号安全,请及时绑定邮箱和手机立即绑定

C+:“STD:Endl”vs“\n”

C+:“STD:Endl”vs“\n”

C++ C
临摹微笑 2019-05-31 13:36:27
C+:“STD:Endl”vs“\n”许多C+书籍都包含这样的示例代码.。std::cout << "Test line" << std::endl;.所以我也一直这么做但是,我看到了很多这样的工作开发人员编写的代码:std::cout << "Test line\n";是否有技术上的理由选择一个而不是另一个,还是仅仅是编码风格的问题?
查看完整描述

4 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

如果文件是在文本模式下打开的,那么变化的行尾字符并不重要,除非您要求二进制文件,否则这就是您所得到的。编译后的程序将写出系统编译的正确内容。

唯一的区别是std::endl刷新输出缓冲区,以及'\n'不会的。如果不希望缓冲区频繁刷新,请使用'\n'..如果需要(例如,如果希望获得所有输出,并且程序不稳定),请使用std::endl.


查看完整回答
反对 回复 2019-05-31
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

这种区别可以通过以下几点加以说明:

std::cout << std::endl;

等于

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

所以,

  • 使用

    std::endl

    如果要强制立即刷新输出,请执行以下操作。
  • 使用

    \n

    如果您担心性能(如果您使用的是

    <<

    (操作员)

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

与其他索赔相反,\n只有当流到文件时,字符才被映射到正确的行序列的平台末端(std::cinstd::cout是特殊的,但仍然是文件(或类似文件)。


查看完整回答
反对 回复 2019-05-31
?
MMTTMM

TA贡献1869条经验 获得超4个赞

我记得在标准中读到过这方面的内容,下面是这样说的:

参见C11标准,它定义了标准流的行为方式,因为C+程序与CRT接口,C11标准应该在这里控制冲洗策略。

ISO/IEC 9899:201X

7.21.3§7

在程序启动时,三个文本流是预先定义的,不需要显式打开-标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。在最初打开时,标准错误流没有被完全缓冲;标准输入流和标准输出流被完全缓冲当且仅当可以确定该流不引用交互设备时。

7.21.3§3

当流未缓冲时,字符将尽快从源或目的地出现。否则,字符可以作为块累积和传输到或从主机环境中传输。当流被完全缓冲时,当缓冲区被填充时,字符将作为块传送到或从主机环境中传输。当流被缓冲时,当遇到新行字符时,字符将作为块传送到或从主机环境中传输。此外,当缓冲区被填充时,当输入被请求到非缓冲流时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符打算作为块传输到主机环境。对这些特性的支持是实现定义的,并且可能通过setbuf和setvbuf函数受到影响。

这意味着std::coutstd::cin全缓冲当且仅当他们指的是一种非交互式设备。换句话说,如果stdout连接到终端,那么行为就没有区别。

但是,如果std::cout.sync_with_stdio(false)被调用,那么'\n'即使对交互设备也不会造成同花顺。

查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 701 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信