標籤:

關於C++ primer 「未知數目的輸入」 的問題(結果與預期不符)?

在C++ primer 第五版 1.4.3. Reading an Unknown Number of Inputs 一節中, 作者使用了以下代碼來實現對未知數目的整形輸入求和:

#include &

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;

}

之後作者提到,「An istream becomes invalid when we hit end-of-file or encounter

an invalid input, such as reading a value that is not an integer. An istream that is in an invalid state will cause the condition to yield false.」,我的理解就是, 只要輸入ctrl+z 在windows下, 或是輸入非整形內容都可以結束循環, 但是當我進行以下輸入時,我得到的結果與預期不符

我預期得到的是6,因為在輸入2.5時,類型不匹配使得while循環被直接終止了。但是現在得到的卻是6+int(2.5)(看上去while裡面的內容又被執行了一次), 而且在這之後程序確實停止了。如果while中的內容被執行了,那麼為什麼循環又會停止呢?在這之後判斷條件並沒有被更新過啊。

先行謝過各位不吝賜教的大神了!!!


不要把流直接當成數字啊,把它看成字元,最底層的實現實際上是先讀字元流再把其轉成你想要的類型的。這裡程序讀最後一行的時候,因為是個int,所以程序之會期待0-9和whitespace那些字元(
空格啥的),這時候出現了一個小數點,程序就讀不進去了,直接把目前讀出來的數返回,然後不會再讀任何東西了。


其實8=1+2+3+2,第五次循環的時候,在.5這裡發生了錯誤,也會導致&>&>失敗。這個時候你要調用cin的其他函數去檢查和跳過錯誤。


推薦閱讀:

如何用 C/C++ 求 1 到 1000 內的所有完全數?
25歲了,從未接觸過編程,還可以把編程作為愛好培養嗎?
微軟究竟遇到了什麼問題使得他們到現在都無法在 C1 中實現兩步名稱查找?
可不可以發明一種工具用C++同時開發iOS和Android呢?
C++的std::thread是怎麼進行參數傳遞的?

TAG:C | CPrimer |