**:
/*如果你把乙個basic_ios類的物件(cin就是)放到if語句的括號裡,它就會被轉換成void*型。如果輸入失敗的話,就會得到乙個空指標(也就是0),那麼if語句就不能通過。* * @brief the quick-and-easy status check.
* * this allows you to write constructs such as
* "if (!a_stream) ..." and "while (a_stream) ..."
*/operator
void*() const
#include#include首先輸出個0.之後輸入x,輸出x;當輸入ctrl+d時,沒有輸出,結束。using
namespace
std;
intmain()
while(cin>>i);
}
#include#include輸入x,輸出x;當輸入ctrl+d時,再輸出個上一次的輸入量,結束。using
namespace
std;
intmain()
while
(cin);
}
ctrl+d表示表示輸入錯誤。
cin.clear()可以重新將cin置為有效。
導致迴圈終止的原因是流物件cin進入錯誤狀態:系統輸入級故障;讀入了無效資料;遇到檔案結束符。
下面是乙個用到cin判斷作為迴圈條件的程式:
#include#include#include
#include
using
namespace
std;
intmain()
cin.clear(); //使cin重新有效,以達到下面while迴圈條件。
}while
(cin);
cout
<
enter search
"<
cin.clear();
cin>>surname;
map > >::iterator it =family.find(surname);
if(it==family.end())
cout
<
no this surname
"<
else
}return
0;}
以下**:
相信對於c++標準i/o庫問題始終在很多人心裡留有疑問,進來因為需要特意去重新了解了關於i/o庫的知識。現在跟大家分享一點,c++中的初學者很熟悉但很迷茫的乙個問題,一下所寫只是個人見解權當作記憶。相信很多人都遇到過這樣的例子:
[cpp]view plain
copy
string str;
while
( cin >> str )
cout <
似乎,大多數初學者都不明白【cin >> str】怎麼可以作為while的判斷語句?
其實,【cin >> str】作為while的條件表示式的解答過程是這樣的:
第一,解「>>」操作符,從cin關聯的緩衝區中讀取值(直到遇到空白、檔案結束符eof、錯誤時停止),如果讀取則放入字串str中,如果讀取失敗,即遇到檔案結束符
eof、錯誤時停止輸入,並設定相應的流狀態標記。
第二,無論解「>>」操作符函式結果如何,都將返回cin。
第三,最迷茫的是返回的cin物件是如何作while條件表示式的??理論上while裡面應該是個轉換為bool值的表示式。網上有說法是呼叫標準庫的過載『!』操作符函式,從而檢查流的狀態標記,對於"while( !cin>>str)"是的但對於「while(cin>>str)」表示式顯然不是。也有說法呼叫了ios的bool型別轉換函式,將cin物件轉換成乙個bool值。其實這種解釋我個人覺得也不對,在cppreference中個如下的標準庫函式幫助文件:
紅線代表的這個是將cin轉換bool表示式的型別轉換函式原型,但從「since c++11」看,這個函式從c++11才有的,在此之前c++標準庫並沒有這個函式。
其 實,不知道到有沒有人看到上面這個函式:
「while(cin>>str)」就是通過這個型別轉換函式實現的,當使用「while(cin>>str)」這個表達時,編譯器將自動執行「從類型別轉換」,將cin轉換成乙個void *型別的指標的。在cplusplus有關於這個標準庫轉換函式的描述:解釋:「此函式從ios(istream父類)類繼承而來的型別轉換函式,並能將乙個流物件轉換成乙個指標;如果流物件的狀態標記,(failbit orbadbit)兩個標記中的乙個被設定,流物件轉換的指標將是乙個空指標,否則就是乙個非0指標
」,並且,此型別轉換函式也是唯一的從ios父類繼承的非explicit從類型別轉換函式。
——>將cin轉換成指標型別了就當然可以作為while的條件表示式了,通過c++的標準轉換,空指標轉換成bool型別的false,非空指標將轉換成bool型別的true,
這樣就能成功
判斷流的狀態了。
當,「cin>>str」讀流操作是成功的,流的狀態標記(failbit
orbadbit
)就不會被設定,
cin執行
「void*」
型別轉換函式轉換而成的指標就非空,非空指標
轉換的bool就為true;
「cin>>str」讀流操作是失敗的,流的狀態標記(failbit
orbadbit
)就會被設定,
cin執行「void*」型別轉換函式轉換而成的指標就為空,空指標轉換的bool就為false。從以上三點看,"cin >> str"就能作為合法的條件表示式置於while中。記:以上只是個人的觀點和認識,權當做學習筆記和大家分享,如有錯誤,希望高手們指出!
為什麼可以用while cin
brief the quick and easy status check.this allows you to write constructs such as if a stream and while a stream operator void const 如果你把乙個basic ios類的...
網域名稱可以用多久 假髮可以用多久?
這要看你說的是哪種假髮了,像是真人發手工鉤織的假髮一般保養好的話,用3 5年都是可以的,因為真人發只要定期噴灑護理液保持頭髮養分是可以用很長時間的,如果是纖維發這種假髮基本上戴個半年就完全沒法用了,很容易炸毛,打理起來也很麻煩的。所以如果打算長期佩戴建議還是選擇真人發手工鉤織的假髮吧,效果會更好!附...
我們可以用SharePoint做什麼
前言 sharepoint平台的體系結構 基本平台 核心服務 應用層面 從上面介紹的這些功能大家簡單的了解sharepoint是如何實現了門戶 文件管理,協作,社交等相關功能的無縫銜接。sharepoint基本實現了常見的站點的常見功能。由於微軟一直在大力的支援,因此sharepoint對於大的企業...