為什麼可以用while cin

2021-09-06 08:54:18 字數 3328 閱讀 3232

**:

/*

* * @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類的物件(cin就是)放到if語句的括號裡,它就會被轉換成void*型。如果輸入失敗的話,就會得到乙個空指標(也就是0),那麼if語句就不能通過。

#include#include

using

namespace

std;

intmain()

while(cin>>i);

}

首先輸出個0.之後輸入x,輸出x;當輸入ctrl+d時,沒有輸出,結束。

#include#include

using

namespace

std;

intmain()

while

(cin);

}

輸入x,輸出x;當輸入ctrl+d時,再輸出個上一次的輸入量,結束。

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對於大的企業...