2013-10-04 33 views
2
#include <iostream> 

int main() 
{ 
    int sum = 0, value = 0; 

    // read until end-of-file, calculating a running total of all values read 
    while (std::cin >> value) 
     sum += value; // equivalent to sum = sum + value 

    std::cout << "Sum is: " << sum << std::endl; 
    return 0; 
} 

該代碼如何知道何時完成抓取輸入值和顯示總和?爲什麼只有輸入非整數值纔會結束?爲什麼我必須在輸入結束時輸入一個非整數來結束程序?

+1

如果您希望人們瞭解它,您應該正確縮進代碼。 –

回答

0

while (std::cin >> value)將在沒有輸入(ctrl-D或流尾)或發生了某些不良事件時結束。你輸入一個非整數會給出一個錯誤,然後它終止while

0

while (std::cin >> value)說要繼續運行而std::cin >> value爲真。方便的是,由於valueint,如果輸入的值不能隱式轉換爲int,那麼該表達式將返回false。否則,它會繼續下去。

1

因爲只要您輸入整數,cin >> value表達式的計算結果爲true。如果輸入非整數,則表達式將失敗,因爲您將嘗試將非整數放入value類型的變量int

4

std::istream& operator>>(int)的計算結果爲false時,循環結束。如果數據流遇到文件結尾或標記爲出錯,則會發生這種情況。輸入浮點數會導致後者發生。

詳細信息
每個流都包含一個指示流的狀態的位掩碼。掩碼中的位包含eof位,失敗位和錯誤位(std::ios_base::eofbit,std::ios_base::failbitstd::ios_base::badbit)。首先是很明顯的:它設置爲觸及EOF。接下來的兩個比較棘手。 std::ios_base::failbit在輸入操作未能讀取預期字符或者輸出操作未能生成所需字符時設置。 std::ios_base::badbit在事情發生錯誤時設置,例如,您的磁盤被炸。從流引用到布爾值的轉換最終涉及檢查是否沒有設置這些位。浮點數中的小數點會導致設置失敗位,並導致循環結束。

+0

+1整潔的措辭 – LihO

+0

它是'std :: stream'或'std :: istream' – khajvah

+0

它是'std :: istream'。修正了,謝謝。 –