当前位置:编程学习 > C/C++ >>

C++中换行符/n与endl有什么区别?

答案:
endl是C++专有的流输出结束符..
cout<<endl;
就是说这个流结束了,,可以从内存中输出出来...
cout<<;
没有endl;他会留在内存中,程序结束时才输出..
'/n'是回车符,没有什么其他的含义,就是输出一个回车!


一般来说输出的字符一般先要传递到缓冲区,然后遇到下列情况时方才输出到标准输出位置(屏幕、打印机、磁盘或者文件)
1 缓冲区满的时候,
2 遇到换行符的时候,
3 需要输入的时候,
4 函数结束时候,
因此我们执行如下的语句也可以立即显示在屏幕上,如:
cout < < "hello world ";
这一点我很不理解,不是说flush或者endl才可以刷新缓冲区的吗,为何上面四种情况都可以刷新刷新缓冲区,既然都可以刷新,那么还要flush和endl干什么?另外下面又出现一种情况满足了上面的四种中的一种情况却不立即显示在屏幕上,如:
#include <iostream>
using namespace std;
int main()
{
cout < < "hello\r ";
return 0;
}
该程序执行后未输出任何字符,但是将\r换成其它任何控制符就可以输出,或者直接在后面加\n也可以立即显示,这又是为何,另外还有一种情况:
#include <iostream.h>
#include <stdio.h>
int main()
{
char a[43];
cout < < "dfs ";
gets(a);
return 0;
}
该程序在VC60和DEV下面运行结果不同,在VC60中不显示dfs,但是会先要求你输入字符,在DEV中先显示dfs,然后要求你输入字符,我们只说VC60,这又是为何原因?
这样两种情况从某种程度上否定了上面四种情况:
1 缓冲区满的时候,
2 遇到换行符的时候,
3 需要输入的时候,
4 函数结束时候,
那么这里就有一个问题,在标准C++中,\n似乎与endl一样能够换行并且刷新缓冲区,而cout < < "hello "也可以直接将暂时存储在缓冲区中的字符立即输出在屏幕上,那么它们是不是都执行了endl的功能,即刷新缓冲区并将数据立即写入存储设备或者显示设备中。
问题实在太多,一个是\n与endl的区别,一个是四种情况是否执行了刷新缓冲区,四种情况如下:
1 缓冲区满的时候,
2 遇到换行符的时候,
3 需要输入的时候,
4 函数结束时候,
第三个是某些已经满足上面四种情况的为何在暂时存放在缓冲区中不立即实现出来,如:
#include <iostream.h>
#include <stdio.h>
int main()
{
char a[43];
cout < < "dfs ";
gets(a);
return 0;
}
第四个问题是回车键的ASCII码等于\n的ASCII码,是不是代表着\n就是回车键。
好了,请高手指教,谢谢。
2的的回答 好经典本来想说了,但以我的能力没什么补充的了
endl有强制刷新缓冲区的功能
endl在C++中使用时一般用在ostream的子类中,使用方法如   

1 cout << "It's a wonderful life!" << endl;

这时除在标准输出打印出It's a wonderful life!外, cout类还要将自己的
缓冲区清空,类似C的fflush( stdout ),而

2 cout << "It's a wonderful life!" << "\n";

却不会有这一动作, 这样在某些情况下语句2将不能打印出要求内容,因为它们还在
cout的缓冲区中.
/n应该是\n
endl是一个特殊值,称为操纵符,将它写入输出流时,不仅具有输出换行的效果,而且它刷新与设备关联的缓冲区,通过刷新缓冲区,用户可立即看到写入到流中的输出。
\n仅仅是一个换行符,将它写入到输出流时,只能起到一个换行的作用,不能刷新输出。

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

程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出信息停留在缓冲区,如果程序崩溃,将会导致对程序崩溃位置的错误判断。
自己在写C++的时候一直在用endl作为换行,突然想起了写C时候的'\n'。

想知道这两都的区别,看了下include目录下的ostream文件,里面这样说的:

template<class _Elem,
class _Traits> inline
basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
二者在C++里的功能相同,都有换行的功能!endl是属于I/O流里的,包含在iostream.h的头文件里的!
endl是C++标准输入输出流。在头文件<iostream> std类中
endl 与 \n 回车符不一样的特点是:
\n是字符格式 不会刷新 也就是有缓存。
endl则是C++标准换行属性 会及时刷新无缓存。
可以根据程序员开发要求不同做出选择使用 \n 或是 endl

上一个:c++设计一个体育彩票的投彩和开奖过程!
下一个:谁能给我些C++编程的实例?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,