一文带你了解c++使用endl和使用‘\n‘的区别
众所周知,endl和’\n’都有换行的作用,但两者是有区别的。
每一个输出流都有一个缓冲区,用来保护程序读写的数据。执行下面的代码:
#include <iostream>int main() {std::cout << "Hello world!" << std::endl;return 0;
};
"Hello World!"会被立即打印出来,这里的输出流对象是cout,但如果不用endl:
#include <iostream>int main() {std::cout << "Hello world!\n";return 0;
};
文本可能在执行完这条语句后立即打印出来,但也可能被保存在缓冲区中。操作系统可能会将多个输出操作组合成一次写操作。可以理解为每输出一次操作系统都要进行一次写操作,不如先放在缓冲区,到时写一次搞定,提高性能。
cout << '\n’的作用就只是单纯地输出换行符,而endl的作用是输出一个换行符,并刷新缓冲区,输出的内容会立刻打印。
导致缓冲区刷新的原因有:
程序正常结束,比如在main函数return后,系统隐式调用**exit(0)**退出程序
#include <iostream>int main() {std::cout << "hello world"; return 0; //此时缓冲区没满,但程序结束导致其刷新
};
缓冲区满时
#include <iostream>int main() {std::cout << "hello";std::cout << "hello";std::cout << "hello";std::cout << "hello";std::cout << "hello"; //假如缓冲区可能在这里刚好就满了,刷新,并打印前五个hellostd::cout << "hello"; std::cout << "hello";return 0; //程序结束,缓冲区刷新,并打印后两个hello
};
unitbuf设置流的内部状态后每次的输出操作
#include <iostream>int main() {std::cout << std::unitbuf;std::cout << "hello"; //刷新,并立即打印std::cout << "hello"; //刷新,并立即打印std::cout << "hello"; //刷新,并立即打印return 0; //刷新
};
被关联的流刷新,默认cin和cerr都关联到cout
#include <iostream>int main() {int n;std::cout << "hello"; //假如缓冲区在这里没满,不刷新std::cin >> n; //cin是默认关联cout的,执行cin操作会刷新cout缓冲区,故hello立即被打印在屏幕上return 0;
};
举个例子,你可能就懂了。
假如正常情况下,缓冲区满了才会打印内容到屏幕上:
#include <iostream>int main() {int n = 0;std::cout << "hello"; //假如缓冲区从这里开始是空的,把"hello"放进去也没满n = 1;std::cout << "world"; //假如再把"world"放进去刚好满了,缓冲区在这里刷新n = 2;return 0;
};
程序会在执行完 std::cout << "world" 操作之后才把 helloworld 一起打印出来。所以 hello 是在 n = 1 之后打印到屏幕上的。
求点赞、收藏!!!
作者水平有限,如果有误,欢迎指正!
编译环境:Visual Studio 2019
一文带你了解c++使用endl和使用‘\n‘的区别相关推荐
- 一文带你彻底搞懂i++和++i的区别,谁的效率更高?
作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦. i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学 ...
- linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法
原标题:Awk是什么?一文带运维小白快速掌握Linux Awk用法 作者:a8 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以 ...
- DNN、RNN、CNN.…..一文带你读懂这些绕晕人的名词
DNN.RNN.CNN.-..一文带你读懂这些绕晕人的名词 https://mp.weixin.qq.com/s/-A9UVk0O0oDMavywRGIKyQ 「撞脸」一直都是娱乐圈一大笑梗. 要是买 ...
- 一文带你深入理解JVM内存模型
一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...
- 训练的神经网络不工作?一文带你跨过这37个坑
近日,Slav Ivanov 在 Medium 上发表了一篇题为<37 Reasons why your Neural Network is not working>的文章,从四个方面(数 ...
- 还不会ts?一文带你打开ts的大门
一文带你打开ts的大门 序言 一.什么是TypeScript? 1.编程语言的类型 2.TypeScript究竟是什么? 二.为什么要学习TypeScript? 1.程序更容易理解 2.效率更高 3. ...
- 一文带你了解Java Agent
转载自 一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...
- 一文带你理解Java中Lock的实现原理
转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...
- pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
本文主要介绍了Pyecharts地理数据可视化,分享给大家,具体如下: 一.Pyecharts简介和安装 1. 简介 Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计, ...
最新文章
- 查找手机型号云服务器,查找手机型号云服务器
- linux c 进程间通信
- JavaScript多文件下载
- C指针原理(35)-Ncurses-文本终端的图形
- 数据结构(二)--队列
- java oo 封装_javaOO——封装、static、成员内部类
- 价格优化与定价管理软件行业调研报告 - 市场现状分析与发展前景预测
- 状态机(FSM)的介绍--以检测序列1001为例
- html5在线表格生成器,js简单实现自动生成表格功能示例
- 斯皮尔 皮尔森 肯德尔_科学网-在SPSS软件相关分析中,pearson(皮尔逊), kendall(肯德尔) 和spearman(斯伯曼/斯皮尔曼)三种相关分析方法有什么异同(转)-刘斌的博文...
- 计算机技术在生物学中的应用鲁东大学,生物科学与技术学院
- 震惊!世界海底光缆分布图!
- 最佳实践|如何写出简单高效的 Flink SQL?
- Java计算机毕业设计图书馆座位预约管理系统源码+系统+数据库+lw文档
- python恶搞代码打开对方摄像头_用Python获取摄像头并实时控制人脸的实现示例
- WEB短信平台定制 短信系统构建 路由通道搭建 web版短信后台管理系统 概括简介
- kubernetes学习:4.安装kubectl命令
- 如何运行Android模拟器
- 基于web的IT技术论坛
- KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解
热门文章
- 跟我一起写 Makefile
- Poker time 2 (enhanced version)
- WPF 制作带TreeView的ComBox
- vue拍照功能PC+手机需要的可以看一下
- 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
- android 距离传感器 api,Android传感器API之:近距离感应Proximity功能源码
- mysql修改密码及变更权限
- SIGMOD 2021 | 时间序列相关论文一览(附原文源码)
- 领英精灵使用手册,功能介绍
- Cocos2d-html5《王者之剑》实现 (1)