2013-07-02 55 views
3

我正在處理以下代碼。輸入流失敗後對輸入變量的影響

#include <iostream> 

int main() 
{ 
    std::cout << "Enter numbers separated by whitespace (use -1 to quit): "; 
    int i = 0; 
    while (i != -1) { 
    std::cin >> i;   
    std::cout << "You entered " << i << '\n'; 
    } 
} 

我知道使用while (std::cin >> i)會更好,但我不明白具體發生。 如果我提供了一個無效的輸入,則循環變得無限,因爲輸入流進入失敗位狀態。我的問題是輸入變量i發生了什麼?在我的情況下,無論先前輸入的值如何,它都變爲0。爲什麼在輸入無效後變爲0?這是預定義的行爲嗎?

+0

如果輸入失敗,輸入變量(即流的參數保持不變)。 –

+0

@Koushik他們是?在我的情況下,它們變爲0。這就是我的問題。它爲什麼會改變,爲什麼是0? – chosentorture

+0

它不適合我,它總是顯示我輸入的最後一個數字。經MSVC2012測試。 – Borgleader

回答

7

因爲你有一個C++ 11之前的編譯器,所以你得到零。在失敗時保持輸入值不變是最新標準中的新內容。舊標準要求如下:

如果提取失敗,則將寫入值,並設置失敗位。如果 提取的結果值太大或太小而不適合 值,則寫入std :: numeric_limits :: max()或std :: numeric_limits :: min() ,並設置failbit標誌。

source

對於GCC,你需要傳遞-std=c++11到編譯器使用新的行爲。

+1

我正在使用GCC 4.7.2,並且在Code :: Blocks中使用-std = C++ 11標誌。該版本是否爲C++ 11之前版本? – chosentorture

+0

直到4.8.1,他們聲稱所有的C++ 11功能都已到位。他們很可能尚未實施行爲改變。 –

+0

我認爲你是對的。它在VS2012上並沒有改變@Borgleader,但它對我來說確實如此。謝謝! – chosentorture