簡體   English   中英

cin 在一個 while 循環中

[英]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如何評估truefalse

當我輸入數字時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&類型的對象。

因此,當您談論truefalse ,您實際上是在談論 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM