endl与\n的区别
看C++Primer的时候看到的,然后去百度了一下;
比较明白的解释:
1、区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽2、接下来我们看一下具体内容的辨析: 要明白\n和endl的区别,首先要明白一个概念: 输出流。 目前输出流的类型很多,有对文件作为目标输出的,有对显示屏(Console间接输出)进行输出的。也有输出到其他抽象结构的。cout的意思是console-output:控制台输出. 但是它的机制还远没有我们想的那么简单,<<后面跟着写什么就直接输出到屏幕什么? 不是这样的。就拿cout<<"Hi,zw.\n"<<endl;来说,cout代表后面的内容输出到控制台的一个缓冲槽,而不是控制台(黑屏幕的那个).缓冲槽在什么情况下会把缓冲槽的内容输出到控制台的【屏幕界面】呢? 当遇到endl或者其他fflush之类的命令或函数时,缓冲槽里的内容会按照顺序输出到控制台,再由控制台进行转意字符的识别打印。endl和\n的区别是:\n在控制台里被翻译为【换行】 endl在控制台里也被翻译成【换行】但endl还在缓冲槽这个部分有个功能:清槽,把缓冲槽里的内容输出到控制台。为什么平时几乎没有任何区别呢? 因为缓冲槽即使不用endl,只要遇到另一行表达式,一般也会自动清槽。
只要程序不蹦,还是没什么区别的,万一程序崩溃,\n可能会留在缓冲区里;
贴两段代码(及其汇编):
#include <iostream>
using namespace std;
int main()
{cout<<"a"<<endl;return 0;
}
.file "\316\264\303\374\303\3731.cpp"
.lcomm __ZStL8__ioinit,1,1.def ___main; .scl 2; .type 32; .endef.section .rdata,"dr"
LC0:.ascii "a\0".text.globl _main.def _main; .scl 2; .type 32; .endef
_main:
LFB971:.cfi_startprocleal 4(%esp), %ecx.cfi_def_cfa 1, 0andl $-16, %esppushl -4(%ecx)pushl %ebp.cfi_escape 0x10,0x5,0x2,0x75,0movl %esp, %ebppushl %ecx.cfi_escape 0xf,0x3,0x75,0x7c,0x6subl $20, %espcall ___mainmovl $LC0, 4(%esp)movl $__ZSt4cout, (%esp)call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovl $__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, (%esp)movl %eax, %ecxcall __ZNSolsEPFRSoS_Esubl $4, %espmovl $0, %eaxmovl -4(%ebp), %ecx.cfi_def_cfa 1, 0leave.cfi_restore 5leal -4(%ecx), %esp.cfi_def_cfa 4, 4ret.cfi_endproc
LFE971:.def ___tcf_0; .scl 3; .type 32; .endef
___tcf_0:
LFB981:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $8, %espmovl $__ZStL8__ioinit, %ecxcall __ZNSt8ios_base4InitD1Evleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE981:.def __Z41__static_initialization_and_destruction_0ii; .scl 3; .type 32; .endef
__Z41__static_initialization_and_destruction_0ii:
LFB980:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $24, %espcmpl $1, 8(%ebp)jne L4cmpl $65535, 12(%ebp)jne L4movl $__ZStL8__ioinit, %ecxcall __ZNSt8ios_base4InitC1Evmovl $___tcf_0, (%esp)call _atexit
L4:leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE980:.def __GLOBAL__sub_I_main; .scl 3; .type 32; .endef
__GLOBAL__sub_I_main:
LFB982:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $24, %espmovl $65535, 4(%esp)movl $1, (%esp)call __Z41__static_initialization_and_destruction_0iileave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE982:.section .ctors,"w".align 4.long __GLOBAL__sub_I_main.ident "GCC: (GNU) 4.8.1".def __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc; .scl 2; .type 32; .endef.def __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_; .scl 2; .type 32; .endef.def __ZNSolsEPFRSoS_E; .scl 2; .type 32; .endef.def __ZNSt8ios_base4InitD1Ev; .scl 2; .type 32; .endef.def __ZNSt8ios_base4InitC1Ev; .scl 2; .type 32; .endef.def _atexit; .scl 2; .type 32; .endef
#include <iostream>
using namespace std;
int main()
{cout<<"a"<<"\n";return 0;
}
.file "\316\264\303\374\303\3732.cpp"
.lcomm __ZStL8__ioinit,1,1.def ___main; .scl 2; .type 32; .endef.section .rdata,"dr"
LC0:.ascii "a\0"
LC1:.ascii "\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef
_main:
LFB971:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5andl $-16, %espsubl $16, %espcall ___mainmovl $LC0, 4(%esp)movl $__ZSt4cout, (%esp)call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovl $LC1, 4(%esp)movl %eax, (%esp)call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovl $0, %eaxleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE971:.def ___tcf_0; .scl 3; .type 32; .endef
___tcf_0:
LFB976:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $8, %espmovl $__ZStL8__ioinit, %ecxcall __ZNSt8ios_base4InitD1Evleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE976:.def __Z41__static_initialization_and_destruction_0ii; .scl 3; .type 32; .endef
__Z41__static_initialization_and_destruction_0ii:
LFB975:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $24, %espcmpl $1, 8(%ebp)jne L4cmpl $65535, 12(%ebp)jne L4movl $__ZStL8__ioinit, %ecxcall __ZNSt8ios_base4InitC1Evmovl $___tcf_0, (%esp)call _atexit
L4:leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE975:.def __GLOBAL__sub_I_main; .scl 3; .type 32; .endef
__GLOBAL__sub_I_main:
LFB977:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5subl $24, %espmovl $65535, 4(%esp)movl $1, (%esp)call __Z41__static_initialization_and_destruction_0iileave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
LFE977:.section .ctors,"w".align 4.long __GLOBAL__sub_I_main.ident "GCC: (GNU) 4.8.1".def __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc; .scl 2; .type 32; .endef.def __ZNSt8ios_base4InitD1Ev; .scl 2; .type 32; .endef.def __ZNSt8ios_base4InitC1Ev; .scl 2; .type 32; .endef.def _atexit; .scl 2; .type 32; .endef
本弱汇编还在学= = 所以很多看不懂=- =~
等能看懂了,再回来研究研究
转载于:https://www.cnblogs.com/XqwKen/p/4564318.html
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 的区别
参考博客:https://blog.csdn.net/u011675745/article/details/51939094 endl 和 \n 在 C++ 中都可以用来换行,std::endl是流操 ...
- 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++的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 ...
最新文章
- AI如何设计,才能人类利益最大化?
- 20210101 Barbalat引理
- Java object方法与GC回收
- python netifaces模块 获取本机IP,网关等信息
- 漫步数理统计十九——独立随机变量
- 微信停止服务印度手机号注册用户!
- SQL Server中时间格式转换函数convert()的使用
- SpringBoot使用Mybatis-PageHelper
- Python3入门(三)——Python基础语法
- python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器
- 基于java坦克大战游戏
- can总线程序讲解_CANOpen系列教程02_理解CAN总线协议
- VC操作word绘制表格
- 亚古兽的进化之路——从Model_Builder,工具箱到python工具箱
- 苹果搜索广告ASA“保姆级”开户教程来袭!拿来吧你!
- 2022年9月青少年C/C++软件编程(四级)等级考试试卷及答案解析
- android三星定位闪退,三星手机闪退问题7种修复方法
- 2021年安全员-C证(上海市)考试APP及安全员-C证(上海市)新版试题
- 年产2万吨山楂酒工厂的设计-陈酿工段及车间的设计(lunwen+任务书+cad图纸)
- [Java] lomboz eclipse 下载. 后来安装启动报错,google了好久,未果。放弃之,转Myeclipse