示例实现一个简单的功能:键盘输入三个数,然后自动输出其中最大的一个数。代码如下:
#include 
#include 
 
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”同样也输出了,但是还没显示出来程序已经退出了。