關於while(geline(cin,s))語句執行解釋

public static void main(String[] args) {
作者:StrayWarrior
鏈接:http://www.zhihu.com/question/27859723/answer/38385260
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


因爲回車輸入的是一個換行符,相當於另起一行,所以getline()會把這個空行讀到s裏面去,你最後輸出的當然就是一個空行。
但是,要理解這個過程究竟是怎麼發生的,題主應該要明白幾個概念:
(1)eof標誌
(2)cin的狀態
while(geline(cin,s))這個語句的執行過程是這樣的:
先調用getline()函數,getline()將istream cin中的內容讀取一行(你輸入的是hello world),保存進string s中,而getline()的返回值就是cin。
也就是說,這個循環的判定條件是while(cin),cin是怎麼轉化爲bool類型進行條件判斷的呢?
這個判定實際上隱式調用了 !cin.fail(),而fail()這個成員函數被定義在ios_base類裏面(這是istream的基類basic_ios的基類)。
那麼調用fail()返回的是什麼?是cin的狀態。cin的狀態是由4個標誌位指示的(關於stream的標誌的內容實際上就可以在C++ Primer中找到),分別是badbit(表示流已經崩潰),failbit(表示IO操作失敗),eofbit,goodbit。
當badbit或者failbit被置位時,fail()會返回true,!fail()結果爲false。當遇到文件末端時,eofbit和failbit都會被置位,因此只有碰到Ctrl+Z(Windows下輸入即等同文件末端eof),while()條件不再滿足,退出。
再來看你的操作過程,hello world,回車,Ctrl+Z。所以程序最後這麼運行的:
hello world被讀入s,換行後的空行被讀入s,末端標誌eof使cin爲無效狀態,while()判斷爲假,循環退出。
輸出s。


}

點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章