endl 和 \n 的区别
参考博客: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 的区别相关推荐
- C++ endl/ends/flush的区别
endl与ends.flush的区别 endl表示输出并换行,ends表示输出加一个空格,flush表示什么都不加,直接输出 int main() {for (int i = 0; i < 5; ...
- C++中换行endl和\n的区别
转载自:http://www.sjyhome.com/c++endl-n.html 在C++中,在显示的形式上 cout<<endl;等同于cout<<"\n&quo ...
- endl与\n的区别
看C++Primer的时候看到的,然后去百度了一下: 比较明白的解释: 1.区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽2.接下来我们看一下具体内容的辨析: 要明白\ ...
- endl和\n的区别
在C++中,打印字符串时,cout不会自动移到下一行,而想要换行,有两种方式,一种是控制符endl,一种是换行符"\n".下面来介绍下两种方式: endl是一个C++符号.表示重起 ...
- endl与'\n'的区别
endl='\n'+刷新缓冲区,但是以下两段代码: #include<iostream> #include<iomanip> #include<cstdlib> u ...
- C++构造函数与析构函数
几乎所有的面向对象的编程语言都保护构造函数与析构函数,好学者就要举手了,啥情况啊,Java里面不就没有析构函数嘛.好吧,你问倒我了,不过可以认为Java的垃圾自动回收机制实现了对象析构的功能.管他呢, ...
- 【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )
文章目录 命名空间简介 自定义命名空间 自定义嵌套命名空间 域作用符 命名空间 与 include 区别 命名空间定义与使用完整代码 命名空间简介 命名空间 ( namespace ) : 1.命名空 ...
- C++和C语言的关系
目录 c和c++的关系 c++的编译和执行过程 用c++输出一个hello world c和c++的关系 C语言是结构化和模块化的语言,面向过程.未完全实现解决软件设计危机的目标. C++保留了C语言 ...
- C++《STL全集》
STL初识 STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西 C++的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 ...
最新文章
- 稀疏矩阵十字链表表示
- HttpPrinter与YunPrinter区别
- android 4.0.3固件,Vi30豪华版_Android4.0.3-1.0测试版固件刷机教程【MM刷机】
- leetcode-2-两数相加
- python写一个自动登录脚本_Python 脚本登录交换机实现自动配置备份
- 【题解】CF#611 H-New Year and Forgotten Tree
- 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?
- C++基础:第八章 深入IO
- Boolean.getBoolean()和Boolean.parseBoolean()
- WIN7专业版下安装MS SQL SERVER 2005 开发版
- 批处理 文件名字前面加前缀或者后缀
- 服务器上怎么开启vt虚拟化功能,如何开启VT虚拟化功能
- 如何高效录制和分享教学视频?我尝试了芦笋
- 货币银行学重点内容复习
- iOS自己实现二维码生成与扫描
- Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
- 做硬件,真的没前途吗?看看资深工程师是怎么说的
- 分布式事务中的时间戳详解
- 山东省第八届 ACM 省赛 Parity check (规律、水)
- 线性代数拾遗(1)—— 行列式的三种公理化构造