1. 程式人生 > >初步理解 while(cin >> x) 、while(cin >> x >> y)

初步理解 while(cin >> x) 、while(cin >> x >> y)

標準 post ron stream mage ostream 解決 很好 結果

初步分析


  在C++中實現連續輸入時,我們會用到 while(cin >> x >> y) ,但是它的條件判斷的原理可不那麽好想,這裏我分享一下我對於它的見解。

  首先來看 cin >> x >> y,它的返回值是什麽?首先要明確的是 cin 是一個 istream 對象,一個對象並沒有返回值這個概念,那可以產生返回值的東西就只有" >> "運算符符了。在《C++ primer(第五版)》中我們知道,"">>"運算符左邊是一個 istream 對象,右邊是需要被輸入的對象,它返回其左側運算對象作為計算結果。也就是說, 它每次進行一次運算後返回的都是 istream 對象,在這裏就是標準輸入 cin。

  這就是為什麽 std::cin >> x >> y; 可以等價於 (std::cin >> x) >> y; 和 std::cin >> x; std::cin >> y; 的原因。

  知道了返回值是什麽後,問題還是沒有解決,因為我們不知道如何判斷一個對象的值是 TRUE 還是 FALSE ,看來得深究一下 cin 對象了。

cin 對象的深入理解


  

  通過查閱資料,我們知道 cin 是行緩沖。對於行緩沖的描述,man手冊裏有如下的一句話可以很好的說明什麽是行緩沖:

技術分享圖片

  大概意思是:cin 是行緩沖,你從鍵盤上輸入一串字符,這一串字符首先會被緩沖區保存下來。每當你按下回車鍵的時候,cin 就會檢測輸入緩沖區是否有可讀的數據。在這裏,cin 會檢查鍵盤輸入是否有流結束標誌 CTRL + X (我用的是 Linux,Windows是 CTRL + Z) 和 CTRL + D(EOF)。在這裏我翻閱了網上資料,發現檢查的方法一共有兩種,一種是阻塞式檢查,一種是非阻塞式檢查。

  阻塞式檢查是這樣:只有在你按下回車後才能檢查之前是否輸入了 CTRL + X。

  非阻塞式檢查是這樣:只要你按了 CTRL + D,就立即響應。如果你按下 CTRL + D 之前還有字符,此時 CTRL + D 相當於是回車的作用,會把你之前從鍵盤輸入的字符輸入緩沖區供讀取使用。

  我們拿一個程序驗證一下所討論的兩種檢查方式:

//This program‘s name is 1.cpp
#include<iostream>

int main(void) 
{
    int i;
    cout << (cin >> i) << endl;    
    
return 0; }  

  Input:

    1、從鍵盤輸入:“12345" + CTRL + D;

    2、從鍵盤輸入:CTRL + D;

    3、從鍵盤輸入:"12345" + CTRL + X;

    4、從鍵盤輸入:CTRL + X。

  Output:

  技術分享圖片

  結果:

    1、立馬響應,同時將12345讀入輸入緩沖區並輸出括號裏的值;

    2、立馬響應,輸出括號裏值,此時 cin 對象值為0

    3、先不響應,再輸入回車後立馬響應,同時讀入”12345“

    4、先不響應,再輸入回車後立馬響應,此時 cin 對象值為0

  

總結


  

  標題中的兩個條件判斷都可以這麽想:由於 cin 是行緩沖且存在兩種阻塞檢查機制,當你按下 CTRL + D 或者 按下 CTRL + X + 回車,都使得 對象 cin的值為0,導致條件判斷為 FALSE。這是我個人的分析,可能有部分知識不嚴謹,歡迎指正。

初步理解 while(cin >> x) 、while(cin >> x >> y)