endl與 \n ; 網羅的本身捋捋~

endl會把一個'\n'寫入流。ios

區別是,endl除了寫'\n'進輸出流以外,還調用輸出流的flush函數,刷新緩衝區,讓數據直接寫入文件或者屏幕上。函數

他們均可以用的,不過若是須要當即顯示,好比輸出到顯示器的場合,最用用endl,若是隻是寫一個'\n'不必定會當即顯示,由於數據可能被存在緩衝區裏,沒有理解寫入設備。測試

輸出流是文件考慮效率的時候,能夠直接寫'\n',這樣不刷新緩衝區,會更快this


首先,endl是一個操做符(Manipulators),但咱們必須知道endl是一個什麼類型的變量。endl是跟在」<<「運算符後面,故endl應該是一個參數。其實endl是一個函數名,
它是一個"<<"運算符重載函數中的參數,參數類型爲函數指針。下面咱們看下內部函數實現。spa

1 ostream& ostream::operator << ( ostream& (*op) (ostream&))
2 {
3     // call the function passed as parameter with this stream   as the argument
4      return (*op) (*this);
5 }指針

1 std::ostream& std::endl (std::ostream& strm)
2 {
3     // write newline
4     strm.put('\n');
5     // flush the output buffer
6     strm.flush();
7     // return strm to allow chaining
8     return strm;
9 }ip

能夠看出,運算符重載函數中的函數參數爲一個函數指針,其指向一個輸入輸出均爲ostream類引用的函數。而endl正是這樣一個函數。因此咱們在運行"cout<<endl;"語句時,
endl是一個函數參數,類型爲函數指針。而後會執行」return (*endl) (*this);「語句,即執行endl函數。endl函數輸出一個換行符,並刷新輸出緩衝區。
這樣咱們知道在標準庫中endl是做爲一個函數實現的,顯然咱們也能夠直接調用這一函數。咱們看下面的測試程序:it

1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6     cout<<endl;
7     endl(cout);
8     return 0;
9 }io

其輸出爲兩個空行。」cout<<endl"中,endl是一個類型爲函數指針的函數參數,經過運算符重載函數間接調用了endl函數。而「endl(cout)」中,endl是函數名,直接調用了endl函數
function

相關文章
相關標籤/搜索