2017-03-04 15 views
1

我有发现场景在执行下面的代码块如何在内部串/焦炭被存储在int和float

#include <iostream> 
using namespace std; 
int main() 
{ 
    int input1; 
    float input2; 

    cout << "Enter a real number :"; 
    cin >> input1; 
    cout << "The int number is " << input1 << endl; 

    cout << "Enter another number :"; 
    cin >> input2; 
    cout << "The float number is " << input2 << endl; 
} 

用于上述的输出是

Enter a real number :a 
The int number is -858993460 
Enter another number :a 
The float number is -1.07374e+08 

能任何人都会好好解释上述场景在内部的处理方式,从而导致上述场景?

注意 -

  • 运行上面VS2015。

正如我刚刚尝试使用C++,请指向任何参考,如果我错过了这个过程。

+0

什么是“输入”?它没有在你的例子中声明。 – mpiatek

+1

你检查了失败位 - 它可能不是一个数字 –

+0

@mpiatek输入在这两种情况下都是'a',并且输出对于int和float都是相同的,对于所有情况没有任何改变 – sasuke

回答

4
int input1; 
float input2; 

在这一点上,无论是input1input2有不确定的值,因为你没有初始化。

std::cin期待中输入一个整数,但你进入'a',这让std::cinfail。该故障持续存在,直到failbit被清除,才能用std::cin执行提取操作。

输入操作失败后,input1input2仍然是“未定义”。打印它们会导致未定义的行为。

+0

是的,你是对的,的确是正确的行为,我用0初始化它们,现在输出似乎是正确的,即使我给了一个错误的输入。 感谢您的解释。我会接受这个答案。 – sasuke

+0

使用'if(!cin)cout <<“failed”;'在'cin >> input'后面检查'cin'确实失败。 –

+0

@GauravSehgal感谢您的输入......它按照您的说法工作。 – sasuke

2

当流不能被解释为适当类型的有效值时,提取操作符不会更改变量。因此,您会看到input1input2的未初始化值。您可以检查cin上的failbit以查看提取操作符是否成功。

例如:

int input1; 
    cout << "Enter a real number :"; 
    cin >> input1; 
    if(cin.good()) 
    { 
     cout << "The int number is " << input1 << endl; 
    } 
    else 
    { 
     cout << "The input was not a number." << endl; 

     // skip to the end of the input 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); 
    } 
+0

是的,它也可以按照您在这里建议的方式处理。感谢您的回应。 – sasuke