参考博客:https://blog.csdn.net/u011675745/article/details/51939094

endl 和 \n 在 C++ 中都可以用来换行,std::endl是流操作,"\n"表示内容为一个回车符的字符串,它们之间还是有一些区别的。

  • \n 只代表换行的转义字符。\n 是C中的格式输出换行,C++ 保留了下来;输出 \n 是实际输出了的 \10 ,往输出流里添加了信息,所有的字符都是 \xx 的形式,换行符也是,你用其它任何字符输出一下,前面都会有四个 * 填充的。
  • endl除了代表换行,还紧跟着清出缓冲槽。 endl 是C++ 中使用的io流换行;输出 endl 不会往输出流里添加东西,只会简单的刷新流并换行,但这种换行并没有往流里添加信息,所以那一行不会用 * 来填充。
std::cout << std::endl;
相当于
std::cout << '\n' << std::flush;​
或者
std::cout << '\n'; std::fflush(stdout);

要明白\n和endl的区别,首先要明白一个概念:输出流

目前输出流的类型很多,有对文件作为目标输出的,有对显示屏(Console间接输出)进行输出的。也有输出到其他抽象结构的。

cout的意思是console-output:控制台输出.但是它的机制还远没有我们想的那么简单,<<后面跟着写什么就直接输出到屏幕什么?不是这样的。

就拿下面的代码来说

cout<<"Hi,zw.\n"<<endl;

cout代表后面的内容输出到控制台的一个缓冲槽,而不是控制台(黑屏幕的那个).

缓冲槽在什么情况下会把缓冲槽的内容输出到控制台的【屏幕界面】呢?当遇到endl或者其他fflush之类的命令或函数时,缓冲槽里的内容会按照顺序输出到控制台,再由控制台进行转意字符的识别打印。

endl和\n的区别是:

  • \n 在控制台里被翻译为【换行】
  • endl 在控制台里也被翻译成【换行】,但 endl 还在缓冲槽这个部分有个功能:清槽,把缓冲槽里的内容输出到控制台。

为什么平时几乎没有任何区别呢?因为缓冲槽即使不用endl,只要遇到另一行表达式,一般也会自动清槽。

何时使用endl,何时使用\n

由于流操作符operator<<的重载,对于’\n’和"\n",输出效果相同。

对于有输出缓冲的流(例如cout、clog),如果不手动进行缓冲区刷新操作,将在缓冲区满后自动刷新输出。不过对于cout来说(相对于文件输出流等),缓冲一般体现得并不明显。但是必要情况下使用endl代替’\n’一般是个好习惯。

对于无缓冲的流(例如标准错误输出流cerr),刷新是不必要的,可以直接使用’\n’,过多的endl是影响程序执行效率低下的因素之一。,

由于直接输入/输出和操作系统相关,可能需要切换内核态/用户态,需要一定的时间开销,频繁地进行操作会极大地降低输入/输出的效率,所以标准库对流的输入/输出操作使用缓冲。具体来讲,就是在内存中保存一个大小相对固定的区域(缓冲区)用来储存临时的输入或输出。当必要时,才向系统设备复制缓冲区的内容并清空缓冲区,这个过程称为刷新。

endl 和 \n 的区别相关推荐

  1. C++ endl/ends/flush的区别

    endl与ends.flush的区别 endl表示输出并换行,ends表示输出加一个空格,flush表示什么都不加,直接输出 int main() {for (int i = 0; i < 5; ...

  2. C++中换行endl和\n的区别

    转载自:http://www.sjyhome.com/c++endl-n.html 在C++中,在显示的形式上 cout<<endl;等同于cout<<"\n&quo ...

  3. endl与\n的区别

    看C++Primer的时候看到的,然后去百度了一下: 比较明白的解释: 1.区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽2.接下来我们看一下具体内容的辨析: 要明白\ ...

  4. endl和\n的区别

    在C++中,打印字符串时,cout不会自动移到下一行,而想要换行,有两种方式,一种是控制符endl,一种是换行符"\n".下面来介绍下两种方式: endl是一个C++符号.表示重起 ...

  5. endl与'\n'的区别

    endl='\n'+刷新缓冲区,但是以下两段代码: #include<iostream> #include<iomanip> #include<cstdlib> u ...

  6. C++构造函数与析构函数

    几乎所有的面向对象的编程语言都保护构造函数与析构函数,好学者就要举手了,啥情况啊,Java里面不就没有析构函数嘛.好吧,你问倒我了,不过可以认为Java的垃圾自动回收机制实现了对象析构的功能.管他呢, ...

  7. 【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )

    文章目录 命名空间简介 自定义命名空间 自定义嵌套命名空间 域作用符 命名空间 与 include 区别 命名空间定义与使用完整代码 命名空间简介 命名空间 ( namespace ) : 1.命名空 ...

  8. C++和C语言的关系

    目录 c和c++的关系 c++的编译和执行过程 用c++输出一个hello world c和c++的关系 C语言是结构化和模块化的语言,面向过程.未完全实现解决软件设计危机的目标. C++保留了C语言 ...

  9. C++《STL全集》

    STL初识 STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西 C++的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 ...

最新文章

  1. 稀疏矩阵十字链表表示
  2. HttpPrinter与YunPrinter区别
  3. android 4.0.3固件,Vi30豪华版_Android4.0.3-1.0测试版固件刷机教程【MM刷机】
  4. leetcode-2-两数相加
  5. python写一个自动登录脚本_Python 脚本登录交换机实现自动配置备份
  6. 【题解】CF#611 H-New Year and Forgotten Tree
  7. 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?
  8. C++基础:第八章 深入IO
  9. Boolean.getBoolean()和Boolean.parseBoolean()
  10. WIN7专业版下安装MS SQL SERVER 2005 开发版
  11. 批处理 文件名字前面加前缀或者后缀
  12. 服务器上怎么开启vt虚拟化功能,如何开启VT虚拟化功能
  13. 如何高效录制和分享教学视频?我尝试了芦笋
  14. 货币银行学重点内容复习
  15. iOS自己实现二维码生成与扫描
  16. Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
  17. 做硬件,真的没前途吗?看看资深工程师是怎么说的
  18. 分布式事务中的时间戳详解
  19. 山东省第八届 ACM 省赛 Parity check (规律、水)
  20. 线性代数拾遗(1)—— 行列式的三种公理化构造

热门文章

  1. 一段集大成的thymeleaf代码
  2. 【PM】1.2 认识产品经理 产品经理能力模型
  3. 阿里云认证是什么?报考要什么条件?
  4. 一些广州音字的输入方法
  5. VLC模拟TS直播流
  6. 计算机辅助项目管理课程方案,计算机辅助项目管理课程设计_大学论文.docx
  7. 非正式组织,比你预想的要重要的多
  8. 从零基础到斩获BAT算法岗offer,围观复旦大佬的秋招之路
  9. 【GDScript】保存/加载物品装备数据
  10. Zookeeper--客户端操作