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