2017-03-27 40 views
2

我當時正在爲一堂課做練習,並且我決定看看如果我輸入char,當代碼期待int時會發生什麼。我在信'g'只是爲了看看會發生什麼......它輸出-858993460,我不知道爲什麼。爲什麼在這段代碼中將char'g'讀入int會產生數字-858993460?

下面是代碼:

#include <iostream> 
#include <iomanip> 
#include <string>  
using namespace std; 

int main() 
{ 
int test; 

cout << "Please enter a even integer or a odd integer. " << endl; 

cin >> test; 
cout << test; //here is where i got the -858993460 



if (test % 2) 
{cout << "TRIANGLE" << endl;} 
else 
{cout << "SQUARE" << endl;} 



return 0; 

} 

那麼,這是否來自-858993460

+0

-858993460是十六進制中的0xcccccccc。這意味着'int'在Visual Studio調試模式下未初始化。 – Marco167

回答

3

std::basic_istream::operator>>的行爲從C++ 11更改。在C++ 11之前,

如果提取失敗(例如,如果輸入的字母是數字所在的位置),則值保持不變並且失敗位被設置。

這似乎是這種情況。 test未初始化;那麼你會得到一個隨機值打印出來。請注意,事實上這是未定義的行爲。

而且,由於C++ 11,

如果提取失敗,零被寫入值和failbit被設置。

這意味着您將在C++ 11之後獲得值0

+0

哦!好的,所以,-858993460是一個默認的\ random值,沒有任何東西被分配給'test'。這是有道理的!非常感謝! –

0

如果您檢查閱讀的結果,您會看到沒有任何內容被讀取。

if (cin >> test) { 
    cout << "read " << test << endl; 
} 
else { 
    cout << "read failed" << endl; 
} 

您打印的值爲test的未初始化值。它可以從運行變爲運行。從技術上講,打印它是未定義的行爲,所以你的程序甚至可能崩潰,儘管這在實踐中不太可能發生。

相關問題