2017-03-27 41 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的未初始化值。它可以从运行变为运行。从技术上讲,打印它是未定义的行为,所以你的程序甚至可能崩溃,尽管这在实践中不太可能发生。

相关问题