看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的区别相关推荐

  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 的区别

    参考博客:https://blog.csdn.net/u011675745/article/details/51939094 endl 和 \n 在 C++ 中都可以用来换行,std::endl是流操 ...

  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. AI如何设计,才能人类利益最大化?
  2. 20210101 Barbalat引理
  3. Java object方法与GC回收
  4. python netifaces模块 获取本机IP,网关等信息
  5. 漫步数理统计十九——独立随机变量
  6. 微信停止服务印度手机号注册用户!
  7. SQL Server中时间格式转换函数convert()的使用
  8. SpringBoot使用Mybatis-PageHelper
  9. Python3入门(三)——Python基础语法
  10. python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器
  11. 基于java坦克大战游戏
  12. can总线程序讲解_CANOpen系列教程02_理解CAN总线协议
  13. VC操作word绘制表格
  14. 亚古兽的进化之路——从Model_Builder,工具箱到python工具箱
  15. 苹果搜索广告ASA“保姆级”开户教程来袭!拿来吧你!
  16. 2022年9月青少年C/C++软件编程(四级)等级考试试卷及答案解析
  17. android三星定位闪退,三星手机闪退问题7种修复方法
  18. 2021年安全员-C证(上海市)考试APP及安全员-C证(上海市)新版试题
  19. 年产2万吨山楂酒工厂的设计-陈酿工段及车间的设计(lunwen+任务书+cad图纸)
  20. [Java] lomboz eclipse 下载. 后来安装启动报错,google了好久,未果。放弃之,转Myeclipse

热门文章

  1. 两个服务共用一个微信支付
  2. Unity 抛物线,直线,Sine曲线等
  3. linuxping百度未知的名称或服务_有赞怎么打通百度小程序?开通有什么好处?
  4. 【读书】2020年阅读记录及心得
  5. Knowledge Graph Embedding: A Survey of Approaches and Applications【翻译】
  6. 行政区划代码2020(SQL)--(下)
  7. mysql路由和MAH
  8. Android studio实现番茄钟
  9. 4K、高清、无水印视频素材库
  10. 设计一个自我介绍简单页面