關於ends是C++中比較基礎的一個東西,但是可能不是每個人都能夠清楚的理解這是個什麼東西,我就經歷了這麼一個過程,寫出來讓大家看看,有什麼理解的不對的地方歡迎拍磚。
今天以前我對ends的理解是:輸出空格的工具,或者說這就是一個逼格比較高的“ ”。(這貌似是拜老師所賜,特地翻出課件發現就是這麼寫的,輸出空格。。。相信有不少人是這麼看的吧)
今天由於某些原因發現 cout<<ends;和cout<<" ";貌似不是一個東西,於是開始探究:
一、cplusplus的解釋(http://www.cplusplus.com/reference/ostream/ends/?kw=ends)
這個網站是最權威的C++相關的網頁,在上面找到了ends的定義:
1 _CRTIMP inline basic_ostream<char, char_traits<char> >& 2 __cdecl ends(basic_ostream<char, char_traits<char> >& _O) 3 { 4 _O.put('\0'); 5 return (_O); 6 }
從這我們不難發現ends實際上是輸出了一個'\0'字符,並不是我們想象的空格。
二、為什麼有時候使用ends輸出的的確是空格
同時我看到了msdn上的解釋(http://msdn.microsoft.com/zh-cn/library/a0cyxz1b.aspx),這個講的原理也是一樣的輸出'\0',但是下面有個例 子:
1 // ostream_ends.cpp 2 // compile with: /EHsc 3 #include <iostream> 4 5 int main( ) 6 { 7 using namespace std; 8 cout << "a"; 9 cout << "b" << ends; 10 cout << "c" << endl; 11 }
這個的輸出是
ab c
這又有點令人不解了,為什麼這個ends當空格又能使了呢。於是我猜測是因為系統的差異,於是我進行了如下實驗:
1、windows下運行
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 cout<<"ddd"<<'\0'<<"dsad"<<endl; 6 }
輸出:
ddd dsad
2、Ubuntu下運行同樣的代碼
輸出:
ddddsad
三、總結
到這裡我覺得這個原因就出來了,其實C++對ends的處理時一樣的,都是在緩沖區插入'\0'然後刷新,之所以在不同的系統下的顯示情況不同是因 為,windows和linux對'\0'的處理方式不同,在windows中會輸出一個空格,而linux下則不會有什麼輸出。