比特派钱包网址|endl
C++中endl的本质是什么-CSDN博客
>C++中endl的本质是什么-CSDN博客
C++中endl的本质是什么
最新推荐文章于 2023-01-27 22:44:03 发布
xiaofei0859
最新推荐文章于 2023-01-27 22:44:03 发布
阅读量4.5w
收藏
239
点赞数
117
分类专栏:
c++基础
c++基础
专栏收录该内容
3 篇文章
7 订阅
订阅专栏
1. endl的本质
自从在C语言的教科书中利用Hello world程序作为学习的起点之后,很多程序设计语言的教科书都沿用了这个做法。我们写过的第一个C++程序可能就是这样的。
#include
using namespace std;
int main(){
cout<<"Hello world"< } 123456 学习过C语言的程序猿自然会把输出语句与C语言中的输出语句联系起来,也就是说: cout<<”Hello world”< 但是,如果我们定义char c=endl;会得到一个编译错误,这说明endl并不是一个字符,所以应该到系统头文件中去查找endl的定义。通过VS2012转到定义,找到了endl的定义如下: template __CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr) { // insert newline and flush stream _Ostr.put(_Ostr.widen('\n')); _Ostr.flush(); return (_Ostr); } 1234567 从定义中看出,endl是一个函数模板,它实例化之后变成一个模板函数,其作用如这个函数模板的注释所示,插入换行符并刷新输出流。其中刷新输出流指的是将缓冲区的数据全部传递到输出设备并将输出缓冲区清空。 2.cout<< endl的介绍 endl是一个函数模板,再被使用时会实例化为模板函数。但是函数调用应该使用一对圆括号,也就是写成endl()的形式,而在语句cout<<”Hello world”< 在头文件iostream中,有这样一条申明语句:extern ostream& cout;这说明cout是一个ostream类对象。而<<原本是用于移位运算的操作符,在这里用于输出,说明它是一个经过重载的操作符函数。如果把endl当做一个模板函数,那么cout< 查找ostream类的定义,发现其实是另一个类模板实例化之后生成的模板类,即: typedef basic_ostream 1 所以,实际上应该在类模板basic_ostream中查找operator<<()的重载版本。在头文件ostream中查找basic_ostream的定义,发现其中operator<<作为成员函数被重载了17次,其中的一种: typedef basic_ostream<_Elem, _Traits> _Myt; _Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&)) { // call basic_ostream manipulator _DEBUG_POINTER(_Pfn); return ((*_Pfn)(*this)); } 1234567 在ostream类中,operator<<作为成员函数重载方式如下: ostream& ostream::operator<<(ostream& (*op)(ostream&)) { return (*op)(*this); } 1234 这个重载正好与endl函数的申明相匹配,所以<<后面是可以跟着endl 。也就是说,cout对象的<<操作符接收到endl函数的地址后会在重载的操作符函数内部调用endl函数,而endl函数会结束当前行并刷新输出缓冲区。 为了证明endl是一个 函数模板,或者说endl是一个经过隐式实例化之后的模板函数,我们把程序改造如下: #include using namespace std; int main(){ cout<<"Hello world"<<&endl; } 123456 这个程序可以正常运行,并且结果完全同上一个程序。原因是对于一个函数而言,函数名本身就代表函数的入口地址,而函数名前加&也代表函数的入口地址。 3.endl其实是IO操纵符 实际上,endl被称为IO操纵符,也有翻译成IO算子的。IO操作符的本质是自由函数,他们并不封装在某个类的内部,使用时不采用显示的函数调用的形式。在< iostream>头文件中定义的操纵符有: endl:输出时插入换行符并刷新流 endls:输出时在字符 插入NULL作为尾符 flush:刷新缓冲区,把流从缓冲区输出到目标设备,并清空缓冲区 ws:输入时略去空白字符 dec:令IO数据按十进制格式 hex:令IO数据按十六进制格式 oct:令IO数据按八进制格式 1234567 在< iomanip>头文件中定义的操作符有: setbase(int) resetiosflags(long) setiosflags(long) setfill(char) setprecision(int) setw(int) 123456 这些格式控制符大致可以替代ios的格式函数成员的功能,且使用比较方便。例如,为了把整数345按16进制输出,可以采用两种方式: int i=345; cout.setf(ios::hex,ios::basefield); cout< 123 或者: cout< 1 可以看出采用格式操纵符比较方便,二者的区别主要在于:格式成员函数是标准输出对象cout的成员函数,因此在使用时必须和cout同时出现,而操纵符是自由函数,可以独立出现,使用格式成员函数要显示采用函数调用的形式,不能用IO运算符”<<”和”>>”形成链式操作。 4.自定义格式操纵符 除了利用系统预定义的操纵符来进行IO格式的控制外,用户还可以自定义操纵符来合并程序中频繁使用的IO读写操作。定义形式如下: 输出流自定义操纵符: ostream &操纵符名(ostream &s) { 自定义代码 return s; } 12345 输入流自定义操纵符: istream &操纵符名(istream &s{ 自定义代码 return s; } 1234 示例代码如下: #include #include using namespace std; std::ostream& OutputNo(std::ostream& s)//编号格式如:0000001 { s< return s; } std::istream& InputHex (std::istream& s)//要求输入的数为十六进制数 { s>>std::hex; return s; } int main() { std::cout< int a; std::cout<<"请输入十六进制的数:"; std::cin>> InputHex >>a; std::cout<<"转化为十进制数:"< return 0; } 12345678910111213141516171819202122232425 程序运行结果: 程序中OutputNo和InputHex都是用户自定义的格式操纵符,操作符的函数原型必须满足cout对象的成员函数operator<<()的重载形式: ostream& ostream::operator<<(ostream& (*op)(ostream&)); 1 所以只要编写一个返回值为std::ostream&,接收一个类型为std::ostream&参数的函数,就可以把函数的入口地址传递给cout.operator<<(),完成格式操纵符的功能。 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P326-P329] [2]http://blog.csdn.net/k346k346/article/details/46836029 优惠劵 xiaofei0859 关注 关注 117 点赞 踩 239 收藏 觉得还不错? 一键收藏 知道了 8 评论 C++中endl的本质是什么 1. endl的本质自从在C语言的教科书中利用Hello world程序作为学习的起点之后,很多程序设计语言的教科书都沿用了这个做法。我们写过的第一个C++程序可能就是这样的。#include using namespace std;int main(){ cout"Hello world"< 复制链接 扫一扫 专栏目录 C++中fstream,ifstream及ofstream用法浅析 12-31 c++中有个类叫做fstream,可以实现打开一个文件作为流。创建一个对象,然后调用该对象的open函数,其主要有两个参数,第一个参数是字符串,表示文件的地址,第二个参数是代开方式,如: fstream fin(a.txt,ios::in); if(fin) { cout< fin.close(); } else { cout< } 注意:如果文件不存在,则打开失败。如果这里打开方式采用的是ios::out,那么如果文件不存在,则会创建该文件。 fstream还有两个子类分别是ifstrea c++学习笔记 最新发布 m0_54720387的博客 09-25 346 c++初学者学习c++ 8 条评论 您还未登录,请先 登录 后发表或查看评论 C++中endl m0_55826123的博客 09-09 5616 endl就是end line的意思,也就是“结束此行” 实际上有两个作用 换行 加"< 清空缓冲区 对缓冲流进行冲刷,将缓冲区的数据全部传递到输出设备并将输出缓冲区清空,使得流中所剩字符被写入输出序列。 ... endl在c语言中的作用,C++中的endl weixin_34920313的博客 05-18 5362 从开始接触C++到现在,一直以为语句cout << "hello world!" << endl;中的endl只是一个相当于C中的换行‘\n’;直到今天,莫名的搜索了一下endl才发现了一个惊天大秘密,原理endl不仅仅是一个换行那么简单,它居然是一个函数模板,实例化后变成一个模板函数,作用就是insertnewline and flush stream;// MANIP... 浅析c++ 中const关键字 12-31 const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。 define与const的区别 1.define作用在预处理时,是简单地字符替换 2. const作用在编译时,具有类型检查的功能 3. const必须进行初始化 常量指针与指针常量 #include using std::endl; using std::cout; int main() { int a = 100; const int *pa = & c++中struct使用注意事项 01-20 1.C++的结构体变量在声明的时候可以省略struct,在c中这样是不可以的,例子如下 #include #include using namespace std; struct test{ int num; string name; }; int main(void) { test t; t.num=1; t.name=jack; cout< } 2.c++的结构体声明可以声明在main()函数中,也可以在main()函数之前,在之前的话,整个程序都可以调用,这也是最常用的 C++ endl 详解 weixin_30311605的博客 09-02 2649 我们在最初学习C++语言时就接触到"cout<
首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<&... cout后面输出时加endl和不加endl的区别 热门推荐 qq_33221533的博客 07-14 7万+ 本文探讨一下C++中使用的时候加endl和不加endl的区别首先,endl就是end line的区别,也就是“结束此行”,但实际上有两个操作1 换行2 对缓冲流进行冲刷,使得流中所有剩余字符被写入输出序列。其实作用说白了就是加<<endl后会有一个换行。下次再用cout输出字符时就会在下一行开始输出,如果不加,就会跟在当前行的最后输出。下面给出一个例子,这个例子是华为机试的例子,就是说... C++中cout、cin和endl的用法 Lee_Shuai的博客 11-23 7万+ 转自:http://blog.csdn.net/zhanghaotian2011/article/details/8868577 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。 C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C+ C++学习记录20--endl,'\n',"\n" tmxk13的博客 11-20 496 endl '\n' "\n" C++中一些小细节 xiaosi的博客 04-08 468 1- "\n"表示一个字符串,只有一个数据是回车。 '\n'表示一个字符。 这两个在输出上是一样的! 2- 关于endl; a.在 C++ 中,终端输出换行时,用 cout<<…< 【C++】endl和\n的区别 08-03 记得上大学时教C++的美女老师讲:endl和'\n'是一样的,都有换行的作用。教材上好像也是这样讲的,所以一直对此深信不疑,在一些简单程序中互换使用,效果也确实一样。最近写了一个小示例,终于发现这两个命令不完全相同。 C++ 中循环链表和约瑟夫环 01-01 循环链表和约瑟夫环 循环链表的实现 单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表。当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head。 代码实现分为四部分: 初始化 插入 删除 定位寻找 代码实现: void ListInit(Node *pNode){ int item; Node *temp,*target; cout<<输入0完成初始化< if(!item) c++编程练习 025:这是什么鬼delete 01-06 北大程序设计与算法(三)测验题汇总(2020春季) 描述 程序填空输出指定结果 #include using namespace std; class A { public: A() { } // 在此处补充你的代码 }; class B:public A { public: ~B() { cout << destructor B << endl; } }; int main() { A * pa; pa = new B; delete pa; return 0; } 输入 无 输出 destructor B destructor A 样例输入 无 样例输出 destru endl 和 \n 的区别 影龙武的博客qq_43594119 08-28 2426 参考博客:https://blog.csdn.net/u011675745/article/details/51939094
endl 和 \n 在 C++ 中都可以用来换行,std::endl是流操作,"\n"表示内容为一个回车符的字符串,它们之间还是有一些区别的。
\n 只代表换行的转义字符。\n 是C中的格式输出换行,C++ 保留了下来;输出 \n 是实际输出了的 \10 ,往输出流里添加... c++中endl到底是什么? wtd_60的专栏 02-09 4298 探讨endl在系统中的具体表示形式 C语言/C++常见习题问答集锦(六十三) 之endl引发的思考 hnjzfwy的博客 01-08 1121 C语言/C++开发的小伙伴们,对于endl,大家可能都不陌生吧,本文探讨一下C++中使用的时候加endl和不加endl的区别,可能有的小伙伴们认为太简单了,这个有必要讨论么,其实我们真正的理解endl了,有些小伙伴看到书山写了,也就照着写,只是一知半解,甚至不理解,本篇我们结合实例,给小伙伴们详细讲解下。 说说std::endl函数 五月花 11-27 6523 所谓std::endl,原来就是一个模板函数名,相当于函数指针啊。 该函数以引用的方式接收一个输出对象,经过处理后,再以引用的方式返回该对象本身。 #include int main(void) { endl(std::cout << "Test 4 std::endl"); endl(std::cout << "Here is the 2nd Line!"); } 请不要对endl前面不加std命名空间限定符感到不解,请查看Koenig looup法则,或者叫ADL法 C++中cout的基础语法与换行符endl的用法 2201_75328713的博客 01-27 3730 1.cout的基本用法 2.endl的基本用法 3.两个关键字的书写格式 c++中类的对象可以直接作为类的成员变量吗? 06-06 对象成员本质上就是一个类对象,可以在另一个类中声明和定义,就像声明和定义其他数据成员一样。 以下是一个使用对象成员的示例: ```c++ class Point { public: Point(int x, int y) : x(x), y(y) {} int getX... “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 xiaofei0859 CSDN认证博客专家 CSDN认证企业博客 码龄16年 暂无认证 55 原创 12万+ 周排名 123万+ 总排名 268万+ 访问 等级 2万+ 积分 425 粉丝 642 获赞 125 评论 1940 收藏 私信 关注 热门文章 硬盘三大种类( SSD ; HHD ; HDD ) 186949 recv send 阻塞和非阻塞 84919 什么是2MSL 66961 C++中endl的本质是什么 45935 Socket连接出现大量的FIN_WAIT_2状态 42994 分类专栏 架构 fastdfs分布式文件系统 24篇 linux rsync 同步 2篇 nginx 46篇 raid 2篇 Android 6篇 DB 25篇 linux 同步 网络测试工具 2篇 进程内存 12篇 编译链接 13篇 socket 14篇 云计算 11篇 加密 9篇 运维 10篇 IO 13篇 TCP/IP 22篇 http 21篇 EPOLL 12篇 操作系统 17篇 文件I/O缓冲 19篇 磁盘IO 23篇 转码 1篇 python 14篇 linux 23篇 性能 9篇 算法 29篇 fs 1篇 存储 12篇 hadoop 7篇 gluster 2篇 GDB 7篇 面试 14篇 hash 2篇 无锁数据结构 2篇 并行计算 4篇 c/c++ 22篇 数据结构 1篇 搜索 1篇 Linux 基础 4篇 c++基础 3篇 sql基础 1篇 java基础 6篇 服务 深度 1篇 最新评论 硬盘三大种类( SSD ; HHD ; HDD ) m0_51917545: 买个贵一点,高可靠性的M2即可,比如致钛的TLC颗粒。 阻塞、非阻塞、异步、同步以及select/poll和epoll qq_41309646: 个人认为真正理想的异步非阻塞,应该是内核线程填充事件链表后,主动通知用户线程,或者调用应用程序事先注册的回调函数来处理数据,如果还需要用户线程不停的轮询来获取事件信息,就不是太完美了,所以也有不少人认为epoll是伪AIO,还是有道理的。 这基本就得是信号机制了。 硬盘三大种类( SSD ; HHD ; HDD ) q-类星体: 写的不错,也很透彻,但是在这个里面有几个部分可以进行优化,比如训练和推理部分,在这个部分可以直接租一个服务器,autodl,inscode和炼丹侠都有算力市场,随便租一个A100然后去跑自己的任务,而且在这个云服务器上也不需要配置环境,能省出来很大一部分精力去干其他的事情 C++中endl的本质是什么 Cat Bayi: 大佬好啊,我是CSDN博主Cat_Bayi,最近更新的文章《C++教程 - How to C++系列专栏第2篇》参考了大佬的文章,特此感谢 博客链接:https://blog.csdn.net/cat_bayi/article/details/132132360 数据摘要算法的测试效率(SHA、MD5和CRC32) fxl1023: 可以看这里的测试,crc快很多,https://iorilan.medium.com/comparison-of-all-hashing-algorithms-88eda61f064a 本机测试也是差不多的结果 [code=plain] ~ time crc32 ndroid-studio-2023.1.1.9-mac_arm.zip f7a60f72 crc32 android-studio-2023.1.1.9-mac_arm.zip 0.13s user 0.23s system 78% cpu 0.463 total ~ time md5 android-studio-2023.1.1.9-mac_arm.zip MD5 (android-studio-2023.1.1.9-mac_arm.zip) = 1ade0aa6c364fc398725d8fba7629894 md5 android-studio-2023.1.1.9-mac_arm.zip 2.26s user 0.22s system 106% cpu 2.328 total [/code] 最新文章 线程之间共享哪些资源 进程和线程、协程的区别 Kubeflow 入门——为 Kubernetes 打造的组件化、可移植、可扩展的机器学习堆栈 2019年2篇 2018年4篇 2017年152篇 2016年242篇 2015年113篇 2014年36篇 2012年13篇 2011年55篇 2010年116篇 2009年14篇 目录 目录 分类专栏 架构 fastdfs分布式文件系统 24篇 linux rsync 同步 2篇 nginx 46篇 raid 2篇 Android 6篇 DB 25篇 linux 同步 网络测试工具 2篇 进程内存 12篇 编译链接 13篇 socket 14篇 云计算 11篇 加密 9篇 运维 10篇 IO 13篇 TCP/IP 22篇 http 21篇 EPOLL 12篇 操作系统 17篇 文件I/O缓冲 19篇 磁盘IO 23篇 转码 1篇 python 14篇 linux 23篇 性能 9篇 算法 29篇 fs 1篇 存储 12篇 hadoop 7篇 gluster 2篇 GDB 7篇 面试 14篇 hash 2篇 无锁数据结构 2篇 并行计算 4篇 c/c++ 22篇 数据结构 1篇 搜索 1篇 Linux 基础 4篇 c++基础 3篇 sql基础 1篇 java基础 6篇 服务 深度 1篇 目录 评论 8 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 C++中 \n 与 endl 的区别是什么? 菜鸟教程 -- 学的不仅是技术,更是梦想! 首页 HTML CSS JavaScript Vue Bootstrap NodeJS Python3 Python2 Java C C++ C# Go SQL Linux jQuery 本地书签 首页 HTML CSS JS 本地书签 Search Python3 教程 Python2 教程 Vue3 教程 vue2 教程 Bootstrap3 教程 Bootstrap4 教程 Bootstrap5 教程 Bootstrap2 教程 C++中 \n 与 endl 的区别是什么? 原文: C++ 教程 KgdBukn C++中 "\n" 与 endl 的区别是什么? "\n" 表示内容为一个回车符的字符串。std::endl 是流操作子,输出的作用和输出 "\n" 类似,但可能略有区别。 std::endl 输出一个换行符,并立即刷新缓冲区。 例如: std::cout << std::endl; 相当于: std::cout << '\n' << std::flush;
或者
std::cout << '\n'; std::fflush(stdout);
由于流操作符 << 的重载,对于 '\n' 和 "\n",输出效果相同。 对于有输出缓冲的流(例如cout、clog),如果不手动进行缓冲区刷新操作,将在缓冲区满后自动刷新输出。不过对于 cout 来说(相对于文件输出流等),缓冲一般体现得并不明显。但是必要情况下使用 endl 代替 '\n' 一般是个好习惯。 对于无缓冲的流(例如标准错误输出流cerr),刷新是不必要的,可以直接使用 '\n'。 更多解析 星铭 cainiao "\n" 表示一个字符串,只有一个数据是回车符。 '\n' 表示一个字符。 这两个在输出上是一样的! 关于 endl: 1、在 C++ 中,终端输出换行时,用 cout<<......< 2、endl 除了写 '\n' 进外,还调用 flush 函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕.考虑效率就用 '\n'。 3、cout *lt;< endl; 除了往输出流中插入一个 '\n' 还有刷新输出流的作用。
cout << endl;
等价于:
\cout << '\n' << flush; 在没有必要刷新输出流的时候应尽量使用 cout << '\n', 过多的 endl 是影响程序执行效率低下的因素之一。 教程列表 ADO 教程 Ajax 教程 Android 教程 Angular2 教程 AngularJS 教程 AppML 教程 ASP 教程 ASP.NET 教程 Bootstrap 教程 Bootstrap4 教程 Bootstrap5 教程 C 教程 C# 教程 C++ 教程 Chart.js 教程 CSS 参考手册 CSS 教程 CSS3 教程 Django 教程 Docker 教程 DTD 教程 ECharts 教程 Eclipse 教程 FastAPI 教程 Firebug 教程 Font Awesome 图标 Foundation 教程 Git 教程 Go 语言教程 Google 地图 API 教程 Highcharts 教程 HTML DOM 教程 HTML 参考手册 HTML 字符集 HTML 教程 HTTP 教程 ionic 教程 iOS 教程 Java 教程 JavaScript 参考手册 Javascript 教程 jQuery EasyUI 教程 jQuery Mobile 教程 jQuery UI 教程 jQuery 教程 JSON 教程 JSP 教程 Julia 教程 Kotlin 教程 Linux 教程 Lua 教程 Markdown 教程 Matplotlib 教程 Maven 教程 Memcached 教程 MongoDB 教程 MySQL 教程 Node.js 教程 NumPy 教程 Pandas 教程 Perl 教程 PHP 教程 PostgreSQL 教程 Python 3 教程 Python 基础教程 Python 量化交易 R 教程 RDF 教程 React 教程 Redis 教程 RSS 教程 Ruby 教程 Rust 教程 Sass 教程 Scala 教程 SciPy 教程 Servlet 教程 SOAP 教程 SQL 教程 SQLite 教程 SVG 教程 SVN 教程 Swift 教程 TCP/IP 教程 TypeScript 教程 VBScript 教程 Vue.js 教程 Vue3 教程 W3C 教程 Web Service 教程 WSDL 教程 XLink 教程 XML DOM 教程 XML Schema 教程 XML 教程 XPath 教程 XQuery 教程 XSLFO 教程 XSLT 教程 数据结构 正则表达式 测验 浏览器 网站品质 网站建设指南 网站服务器教程 设计模式 在线实例 ·HTML 实例 ·CSS 实例 ·JavaScript 实例 ·Ajax 实例 ·jQuery 实例 ·XML 实例 ·Java 实例 字符集&工具 · HTML 字符集设置 · HTML ASCII 字符集 · JS 混淆/加密 · PNG/JPEG 图片压缩 · HTML 拾色器 · JSON 格式化工具 · 随机数生成器 最新更新 · Rust 宏 · Seaborn 教程 · Pandas 相关性分析 · 31.2k star, 免... · Dev Home —... · 免费开源的 AI ... · 11.2k star, 免... 站点信息 · 意见反馈 · 免责声明 · 关于我们 · 文章归档 关注微信 Copyright © 2013-2024 菜鸟教程 runoob.com All Rights Reserved. 备案号:闽ICP备15012807号-1 微信关注 C++中cout、cin和endl的用法_count< C++中cout、cin和endl的用法 最新推荐文章于 2024-01-30 22:23:50 发布 Lee_Shuai 最新推荐文章于 2024-01-30 22:23:50 发布 阅读量7.3w 收藏 457 点赞数 122 分类专栏: C++ 文章标签: C++ C++ 专栏收录该内容 13 篇文章 11 订阅 订阅专栏 转自:http://blog.csdn.net/zhanghaotian2011/article/details/8868577 转自:http://blog.csdn.net/u011675745/article/details/51939108 转自:http://blog.163.com/ac_victory/blog/static/1033187262008112222553105/ 对以上三篇文章,我添加了自己已有的部分知识,并重新地汇总整理 转载请注明:http://blog.csdn.Net/lee_shuai 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。 C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。 有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中: #include 尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。 一 输入流与输出流的基本操作 cout语句的一般格式为: cout<<表达式1<<表达式2<<……<<表达式n; cin语句的一般格式为: cin>>变量1>>变量2>>……>>变量n; 在定义流对象,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或‘\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。 1.1 cout多行格式 一个cout语句可以分写成若干行。如 cout<<"This is a simple C++ program."< 可以写成 cout<<"This is " //注意行末尾无分号 <<"a C++ " <<"program." < 也可写成多个cout语句,即 cout<<"This is "; //语句末尾有分号 cout <<"a C++ "; cout <<"program."; cout< 以上3种情况的输出均为 This is a simple C++ program. 注意 不能用一个插入运算符“<<”插入多个输出项,如: cout< cout< 作为一项 1.2 cout输出类型 在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则 cout< 会以下面的形式输出: 4 345.789 a 1.3 cin多行格式 与cout类似,一个cin语句可以分写成若干行。如 cin>>a>>b>>c>>d; 可以写成 cin>>a //注意行末尾无分号 >>b //这样写可能看起来清晰些 >>c >>d; 也可以写成 cin>>a; cin>>b; cin>>c; cin>>d; 以上3种情况均可以从键盘输入: 1 2 3 4 ↙ 也可以分多行输入数据: 1↙ 2 3↙ 4↙ 在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有 char c1,c2; int a; float b; cin>>c1>>c2>>a>>b; 如果输入 1234 56.78↙ 注意: 34后面应该有空格以便和56.78分隔开。也可以按下面格式输入: 1 2 34 56.78↙ (在1和2之间有空格) 不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以用3.4.3节介绍的getchar函数。 在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。 二 关于endl的用法 2.1 关于“ ”和’ ’的用法解析 1) "a"和'a'的区别,前者是字符串,后者是字符。 2) "\n"是个const char*, 指向一个2字节的区域,调用的是operator <<(const char *); 而'\n'是一个字节的char, 调用的是operator <<(char). 但是性能影响很小,或者可能会被编译器优化掉。 2.2 初级认识 1 在c++中,终端输出换行时,用cout<<......< 2 cout << endl;除了往输出流中插入一个'\n',还有刷新输出流的作用。 cout < 在大的程序中,建议用endl来换行。在没有必要刷新输出流的时候应尽量使用cout <<'\n', 过多的endl是影响程序执行效率低下的因素之一。“\n”与’\n’,在输出上都是表示换行,没有区别 2.3 深层解析 我们在最初学习C++语言时就接触到"cout< 首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<<“运算符后面,故endl应该是一个参数。其实endl是一个函数名,它是一个"<<"运算符重载函数中的参数,参数类型为函数指针。下面我们看下内部函数实现。 ostream& ostream::operator << ( ostream& (*op)(ostream&)) { // call the function passed as parameter with this stream as theargument return (*op) (*this); } std::ostream& std::endl (std::ostream& strm) { // write newline strm.put('\n'); // flush the output buffer strm.flush(); // return strm to allowchaining return strm; } 可以看出,运算符重载函数中的函数参数为一个函数指针,其指向一个输入输出均为ostream类引用的函数。而endl正是这样一个函数。所以我们在运行"cout< endl函数输出一个换行符,并刷新输出缓冲区。 这样我们知道在标准库中endl是作为一个函数实现的,显然我们也可以直接调用这一函数。我们看下面的测试程序: #include using namespace std; int main() { cout< endl(cout); return 0; } 其输出为两个空行。”cout< 三 在输入流与输出流中使用控制符 上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。 需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。 3.1 三个使用控制符的例子 例1:输出双精度数 double a=123.456789012345;对a赋初值 (1) cout< (2) cout< (3) cout< (4) cout<< setiosflags(ios∷fixed);输出:123.456789 (5) cout< (6) cout< (7) cout< 例2:整数输出的 int b=123456;对b赋初值 (1) cout< (2) cout< (3) cout< (4) cout< (5) cout< (6) cout< 如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。 例3: 各行小数点对齐 #include #include using namespace std; int main( ) { double a=123.456,b=3.14159,c=-3214.67; cout< cout< cout< cout< return 0; } 输出如下: 123.46 (字段宽度为10,右对齐,取两位小数) 3.14 -3214.67 先统一设置定点形式输出、取两位小数、右对。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。 3.2 六个输入函数用法 学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息; 1. cin 2. cin.get() 3. cin.getline() 4. getline() 5. gets() 6. getchar() 3.2.1 cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include using namespace std; main () { int a,b; cin>>a>>b; cout< } 输入:2[回车]3[回车] 输出:5 用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束 #include using namespace std; main () { char a[20]; cin>>a;C++中 \n 与 endl 的区别是什么?
C++中cout、cin和endl的用法_count<
版权声明:本文由比特派钱包网址发布,如需转载请注明出处。
本文链接:https://www.siyuewuyu.com/article/563.html