是变量初始化失败吗?

向量

遵循 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 章输入和类型部分下)所暗示的,它输出一个字符串,让我们熟悉一个人姓名年龄由于我已将整数变量 age初始化-1如果我错误地将字符串值输入age 中,程序必须将-1返回给监视器问题是它不会发生在我的电脑上。我已经尝试编译并运行了 19 次程序(我记得它......)但结果总是一样的:它输出0 而不是 -1

例如,如果我输入ABCXYZ 16,那么输出将是一个漂亮而简单的Hello, ABCXYZ (age 16)但是如果输入是16 ABCXYZ,那么输出结果是Hello, ABCXYZ (age 0),我希望它是Hello, ABCXYZ (age -1 )因为字符串ABCXYZ不会被读入age(它是一个整数变量) 并因此给出初始化值,因为它没有被覆盖。

任何的想法?

PS:我正在使用 Code:Blocks with GCC - 8.1.0

卡米尔库克

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 中。

您正在使用配置为与 c++11 之后的标准兼容的编译器和 C++ 标准库进行编译,因此当std::cin无法读取该字段时,会将 的值0存储到age.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章