1. 程式人生 > >cin和cout返回值問題

cin和cout返回值問題

cincout返回值問題

 ---雨竹清風

今天看了段程式碼感覺怪怪的。

string value;

while(cin>>value)

{

   cout<<value<<endl;

}

哪不對吶?while迴圈條件,while迴圈判斷條件還能是非bool,非常量型的?

從網上查了一下,下面是引用網上大牛的原話。

分下面幾點來說明:

1.cincoutiostream類的2個物件,物件是無所謂返回值的.有返回值的是<<還有>>2個操作符.由於我們知道,操作符其實也就是函式(在操作符過載的時候可以清晰的認識到).

>>操作符返回的是它的左運算元(left-operand).對於cin>>value;返回左運算元就是操作的流的引用,也就是istream&.

2.但是好像還是不對,因為while裡面判斷的是bool,難道還能判斷istream&?

開啟<ISTREAM>標頭檔案,找到類模板basic_istream的定義,摘出這麼兩個語來:

typedef basic_istream<_E, _Tr> _Myt;

_Myt& operator>>(......) ......

這說明cin >>的返回值型別就是basic_istream&

,可是放到while()中情況又該是怎樣的。while()中要求是布林表示式,難不成basic_istream&型別可以轉換成bool型別?繼續檢視標頭檔案,發現所有的operator過載函式都是<<>>,沒有找到用於型別轉換的操作那就只好追溯到父類basic_ios了。

開啟標頭檔案<IOS.H>,找到ios的定義,其中有這麼一條語句,型別轉換函式的定義:

operator void *() const { if(state&(badbit|failbit) ) return 0; return (void this; }

有這個函式的定義之後,編譯器會在需要的情況下將ios

型別自動轉換為void*型別。因此,在表示式while (cin >> m >> n)中,括號中的表示式為了匹配bool型別將自動轉換為void*型別。如果讀入時發生錯誤返回0,否則返回cin的地址