C++-C++ 中 endl 的真实含义?

C++-C++ 中 endl 的真实含义?

瑾兮 发布于 2017-07-15 字数 135 浏览 1617 回复 4

我们都知道C++中有"cout<<endl;"这样的语句,endl表示换行的意思。我们一直习惯这样使用,但是却不知道 endl 的内部是怎么实现的?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

偏爱自由 2017-10-03 4 楼

这个问题你其实可以和n,flush对比着来认识。cout的意思是console-output:控制台输出。n在控制台里被翻译为换行,endl在控制台里也被翻译为换行,但是cout的机制并非我们想象的那么简单,这就让endl有了大显身手的机会。比如cout<<"12345678-9"<<endl,cout其实并不是把输出的内容直接就输出到控制台(屏幕)上,而是将输出内容保存到缓冲区(Buffer),当缓冲区被填满时,才会输出到控制台。但是我们肯定不愿意等缓冲区满了才输出,所以我们就要认为地干涉这种机制,endl就是一个比较不错的选择。当输出字符中出现endl控制符时,缓冲区里的数据会被立即清空并输出到控制台,无论缓冲区是否已满。因此endl的作用是将光标移动到新一行开头,并清空缓冲区。而n的效果仅仅是将光标移动到下一行的开头处,flush函数有清空缓冲区的功能,但它并不能移动光标,所以在一定程度上你可以把endl看做是二者的结合。

归属感 2017-09-21 3 楼

std::endl是stream的manipulator函数:
ostream& endl ( ostream& os );
它的作用是:
插入换行符、清楚缓冲区:
Inserts a new-line character.
Additionally, for buffered streams, endl flushes the buffer (i.e. writes all unwritten characters in the buffer to the output sequence, see ostream::flush).

关于endl与'n'的区别:
就是清楚缓冲区的区别。'n'不会清楚缓冲区。

如果你不想频繁清楚缓冲区,使用'n',否则使用endl。

参考资料:
C++: “std::endl” vs “n”

虐人心 2017-09-17 2 楼

插入一个n,然后清理缓存。

清晨说ぺ晚安 2017-09-15 1 楼

endl其实是一个函数,见其源代码

_CRTIMP2_PURE inline basic_ostream<wchar_t, char_traits<wchar_t> >&
__CLRCALL_OR_CDECL endl(basic_ostream<wchar_t,
char_traits<wchar_t> >& _Ostr)
{ // insert newline and flush wide stream
_Ostr.put('n');
_Ostr.flush();
return (_Ostr);
}

不看其返回类型等一堆,可以看到里面内部实现就是先put换行符之后然后再flash