原创 【C++】endl和'\n'的却别

2011-12-6 22:43 4472 26 36 分类: 消费电子

记得上大学时教C++的美女老师讲:endl和'\n'是一样的,都有换行的作用。教材上好像也是这样讲的,所以一直对此深信不疑,在一些简单程序中互换使用,效果也确实一样。最近写了一个小示例,终于发现这两个命令不完全相同。

 

示例实现一个简单的功能:键盘输入三个数,然后自动输出其中最大的一个数。代码如下:

 

#include <iostream.h>

#include <windows.h>

 

void main(void)

{

       int a, b, c;

       char close;

       cout<<"Input three INT please:"<<endl;

       cin>>a>>b>>c;                    //输入三个数

 

       cout<<"a = "<<a<<'\t'<<"b = "<<b<<'\t'<<"c = "<<c<<'\n';   //输出三个数

 

       cout<<"The max is:"<<'\t';           

 

       if(a >= b && a >= c)

       {

              cout<<a<<endl;

       }

       else

       {

              if(b >= a && b >= c)

              {

                     cout<<b<<endl;

              }

              else

              {

                     cout<<c<<endl;

              }

       }                                        //以上代码计算并输出最大数

       cout<<'\a';                            //A输出振铃

       cout<<"a"<<endl;                 //B

       cout<<"b";                          //C

       cout<<"c"<<'\n';                   //D

       system("pause");                  //E

}

 

在C++编译环境中运行此段代码,输入三个数回车以后,立即输出最大数,以及A行振铃“嘀”的一声,输出B行字符“a”,然后输出“请按任意键继续…”,按任意键后输出“bc”,然后输出“Press any key to continue…”,然后按任意键结束。如果单独执行程序生成的“.exe”文件,前面输入输出都一样,输出“请按任意键继续…”后,按任意键,没有看见“bc”输出,程序直接结束退出了。

其中“请按任意键继续…”是由E行输出的。按道理,程序顺序执行,输出“a”换行再输出“bc”,然后才执行E行会输出“请按任意键继续…”。而实际上屏幕上显示的是E行先于C,D两行输出,这显然不合常理。因为B行用了endl,而D行用的是'\n',可见这两个命令还是有区别的。在网上找到如下解释:

 

endl是一个特殊值,称为操纵符,将它写入输出流时,不仅具有输出换行的效果,而且它刷新与设备关联的缓冲区,通过刷新缓冲区,用户可立即看到写入到流中的输出。

\n仅仅是一个换行符,将它写入到输出流时,只能起到一个换行的作用,不能刷新输出。

因此建议,在能用cout<<endl;的形式时不要用cout<<'\n';形式。

程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出信息停留在缓冲区,如果程序崩溃,将会导致对程序崩溃位置的错误判断。
endl = \n + flush

 

看过这段解释后,终于明白了。示例程序执行时,是按顺序ABCDE依次执行下来的,B行输出“a”后换行,并刷新了缓冲区,所以屏幕上显示了“a”。而CD行输出“bc”后虽然也换行,但是并没有刷新显示出来。于是又执行了E行,程序暂停并输出提示信息,等待用户结束程序。在编译环境中,由于程序调试时自行加了暂停等待的命令“Press any key to continue…”,所以在程序退出之前还能看见“bc”被显示出来。而单独的exe文件中并没有这个命令,在“请按任意键继续…”之后按任意键,程序直接退出了,“bc”同样也输出了,但是还没显示出来程序已经退出了。

20111206223203

 

文章评论10条评论)

登录后参与讨论

用户1641693 2012-1-10 14:34

用户1586985 2011-12-27 08:28

有什么问题吗?请指教

用户1021281 2011-12-26 22:34

你要不要再跟老師問問,真的是如你所說的嗎? cout<<"a"<

用户1586985 2011-12-14 12:32

Visual C++ 吗? 那你用我上面的代码生成exe文件试试呢?

用户1406868 2011-12-13 19:47

我在visual下编译是按照ABCDE的顺序执行啊?

用户1586985 2011-12-12 12:27

就是很美的那种样子,自己想吧

用户1296075 2011-12-12 11:41

比較好奇那位美女老師長什麼模樣?呵呵

用户1190942 2011-12-8 09:00

hao

tom2068_897375514 2011-12-8 08:09

C++的流操作符对于字符串输入输出来讲,极丑陋难看也不好用,还是printf好!

用户1603917 2011-12-7 10:06

还是新人,学习中,谢谢了
相关推荐阅读
用户1586985 2013-09-02 08:39
[段子]医院院长修手机
某医院院长笔记本电脑有故障,拿到一个3甲级大修理店去修。 修理店接待人员彬彬有礼: “OK,开机费50元。” 医院院长: “为什么还没修理就要先交费?” 修理...
用户1586985 2011-12-27 15:07
【总结】SPY调试记录
----此文真实记录我在调试过程中遇到的问题,并最终解决问题调试成功的经历。   SPY是我们公司用来测试遥控器的一个特殊接收器,配合上位机软件使用,可以在电脑上查看遥控器发出指令的详细信...
用户1586985 2011-12-26 14:01
【读书随感】愤青的思考
  今天在网上读了一片文章,感觉不错,特此摘录和评论如下(黑体字部分为原文摘录): 一:      “国民的喜好:美国人喜欢打桥牌,有什么实力摊开了打。日本人喜欢下围棋,团队共进退。中...
用户1586985 2011-12-11 18:10
【随感】太落伍了
用了五年多的电脑终于寿终正寝了,送到维修店修了几个小时,那个人告诉我没救了。我问那个修电脑的,卖给他能值多少钱,那人说:不要!晕,电脑坏了,卖破烂都没人要。   前两天在网上碰见一个开网吧...
用户1586985 2011-12-05 10:51
【问题】修电视机遥控器时遇到的问题
最近修了两个电视遥控器,其实不应该算修,只是看了一下而已,根本没有解决问题。   一个是我的山寨显示器(既可做电脑显示器,又可当电视用)的遥控器,做工很简单,主控芯片是一个黑片,晶振两脚都...
我要评论
10
26
关闭 站长推荐上一条 /2 下一条