变量初始化失败吗?

时间:2020-05-14 08:13:20

标签: c++ variables variable-initialization

紧随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

2 个答案:

答案 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),并且不显示任何内容。