[英]cin inside a while loop
我寫了一個簡單的代碼:
#include <iostream>
using namespace std;
int main()
{
int a, b;
while (cin >> a >> b) //Note the cin inside while loop
{
cout << a << b << "\n";
}
}
我們知道while
循環僅在表達式計算為true
( 1
) 或false
( 0
) 時起作用。 cin
如何評估true
和false
。
當我輸入數字時while循環如何運行並在我輸入非數字內容時停止? 它是如何評價真假的?
當你寫cin >> a
,你實際上是在使用std::istream::operator>>
,根據這里的引用,這個操作符返回一個istream&
對象引用,並把右手邊的變量(引用)作為它的參數。 這就是你可以像這樣鏈接它的方式: cin >> a >> b
。
換個角度看這個cin >> a >> b
鏈,分解的時候就是這兩個步驟:
cin >> a
返回一些中間值,假設它是x
。 (您實際上可以嘗試auto x = cin >> a
。(cin >> a) >> b
,當我們使用這個中間值x
,我們可以把它寫成x >> b
。 那么這個x
到底是什么? x
在這里與cin
保持相同的位置,它是istream&
類型的對象。
因此,當您談論true
或false
,您實際上是在談論 this 返回的istream&
引用,引用一個對象,它是true
還是false
。 當標准輸出捕捉到 EOF 符號時(例如在類似 unix 的系統中鍵入 Ctrl-C 時,或者當您讀到文件末尾時),這將是false
。
因此,您的代碼可以擴展為
#include <iostream>
using namespace std;
int main()
{
int a, b;
auto x = cin >> a >> b
while (x)
{
cout << a << b << "\n";
}
}
如果您使用的是像 Visual Studio 這樣的 IDE,您可以將鼠標指向變量x
,它會提示您x
的類型,這將是一個istream&
。
另外,多虧了 Bob__,這個istream&
類可以被轉換為一個ios::operator bool
類,正如這里所寫的,無論它是true
還是false
代表了這個stream
的狀態( ios_base::iostate
),因此,
使得使用流和函數返回
while(stream >> value) {...}
引用作為循環條件成為可能,從而產生慣用的 C++ 輸入循環,例如while(stream >> value) {...}
或while(getline(stream, string)){...}
. 只有當輸入操作成功時,這樣的循環才會執行循環體。
為了進一步理解,您應該閱讀教科書中的運算符(重載)章節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.