紧随Bjarne Stroustrup撰写的“使用C ++编程原理和实践”一书,从最基本的方面学习C ++。事实证明一切都很好,直到发生这种情况...
int main()
{
cout << "Please enter your first name and age\n";
string first_name = "???"; // string variable
int age = -1; // integer variable
cin >> first_name >> age; // read a string and then integer
cout << "Hello, " << first_name << " (age " << age << ")\n";
}
现在,如上述代码(在“输入和类型”部分的第2章中)所建议的那样,它将输出一个字符串,使我们熟悉 name 和一个人的年龄。当我将整数变量 age 初始化为 -1 时,程序必须返回 -1 < / strong>,如果我因误输入 string值到 age 而进入监视器。问题是它不会在我的计算机上发生。我已经尝试并编译并运行了19次程序(我确实记得它...),但是结果始终是相同的:它输出 0而不是-1 。
例如如果我输入ABCXYZ 16
,则输出将是一个非常简单的你好,ABCXYZ(16岁)。但是,如果输入为16 ABCXYZ
,则输出结果为你好,ABCXYZ(年龄0),我希望是你好,ABCXYZ(年龄- 1 ),因为字符串ABCXYZ
不会读入 age (它是一个整数变量),并给出初始化值,因为它没有被覆盖。
有什么主意吗?
P.S .:我在GCC中使用Code:Blocks-8.1.0
答案 0 :(得分:4)
std::istream& operator>>(int &value)
内部调用std::num_get::get()
。从cppreference std::num_get::get()起,行为在c ++ 11中发生了变化。
具有v
来表示我们读入的变量,直到c ++ 11为止:
- 如果发生错误,则v保持不变。
但是从c ++ 11开始:
- 中
如果转换函数无法转换整个字段,则 值``0''存储在v
如果转换函数导致 正或负值太大,无法适合v的类型,即 有符号整数类型,最正或负可表示 值分别存储在v中
如果转换函数结果 值不适合v的类型,v是无符号整数 类型,最正的可表示值存储在v中。
您正在使用配置为与c ++ 11之后的标准兼容的编译器和C ++标准库进行编译,因此当std::cin
无法读取该字段时,0
的值将存储到age
。
答案 1 :(得分:1)
问题被隔离到>>
运算符中,该运算符无法将您的字符串输入转换为整数(由于std::cin >> x
处理了您为{{ 1}}),因此无论您使用哪个值初始化整数变量,都将返回0。
这是自Kamil提到的C ++ 11开始以来所做的,并且符合以前的标准,该值将保持不变,并且对于您的情况将返回-1。
您可以检查x
是失败还是通过,以得出结论:
cin
如果输入整数(如int main()
{
int age = -1;
std::cin >> age;
if(cin)
std::cout << age;
}
的类型所期望的那样),则将获得将其初始化为的age值的输出,否则,如果输入字符串,则cin会失败(及其cin按照上面的if语句,将触发故障位,导致false),并且不显示任何内容。