2017-11-18 228 views
2

這裏是一個重載>>操作功能:如果(!(是>> s))是什麼意思?

std::istream& operator>>(std::istream& is, std::vector<int>& v){ 
    string s; 
    if (! (is >> s)) 
    return is; 
    ... 
    return is; 
} 

據我瞭解,if(! (is >> s))沒有任何意義,因爲終端或控制檯將等待來自鍵盤或其他來源的輸入輸入s。因此if()中的條件值最終將爲false。誰可以幫忙?

+0

它必須被理解爲「if'is' can not read a string」。 –

+0

該代碼太密集。它應該寫成兩部分:'是>> s;如果(!是)...'。 –

回答

3

is >> s嘗試從流is讀取字符串s

istream s operator>>()返回對is的引用。

istream s operator!()測試流是否處於無效狀態。具體而言,如果流的badbit或failbit已設置,則返回true

所以,

if (! (is >> s)) 
    return is; 

在功能上等同於

is >> s; 
if (is.fail()) return is; // is.fail() returns true if failbit or badbit are set 

這意味着該函數將立即返回,如果讀取的字符串從流失敗。請注意,這不同於到達流的末尾。

+0

我這篇文章很詳盡,但其他人對我也很有幫助,謝謝! :) – Finley

2

istream不一定是控制檯。它可以是一個串流。此外,應用程序代碼不會看到「等待用戶輸入」。當輸入流被填充時(通過操作系統,底層庫,...),它是睡着了。

無論如何:如果輸入流根本不包含任何數據,則此條件爲真。

std::string s; // empty! 
std::stringstream ss(s); 

std::vector<std::string> strings; 
ss >> strings; // should be empty! 
-1

你在一行做很多事情

! (is >> s) 

你把InputStream和使用它來分配對象s時,如果條件

1

要在評估S的TEH結果瞭解什麼if (!(is >> s))意味着您需要了解if (is >> s)的含義。

由於isstd::istream,運營商>>返回std::istream。因此,is >> sstd::istream,其在if內必須產生邏輯值truefalseThis Q&A解釋了它是如何在不同版本的C++中完成的。基本上,當操作成功時,std::istream評估爲真實條件。

現在你知道的is >> s的意思,你可以計算出,添加否定翻轉這個意思:讀取sis是不成功的,只有當!(is >> s)將是真實的。對於字符串,不成功的讀取意味着該流處於無效狀態,例如,因爲已到達流尾。