0

遵循 Bjarne Stroustrup 的《Programming Principles and Practice Using 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 和 GCC - 8.1.0

4

2 回答 2

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

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

于 2020-05-14T08:26:51.480 回答
1

该问题与>>操作员隔离,它无法将您的字符串输入转换为整数(这是预期的,因为std::cin >> x处理预期的输入,来自您定义的类型x),因此无论您初始化的值如何,都返回 0整数变量。

这是自卡米尔提到的 C++ 11 以来完成的,并且符合以前的标准,该值将保持不变,并为您的情况返回 -1。

您可以检查是否cin失败或通过,以自己得出结论:

int main() 
{
      int age = -1; 
      std::cin >> age;
      if(cin) 
      std::cout << age; 
}

如果你输入一个整数(如预期的类型age),你会得到你初始化它的年龄值的输出,否则如果你输入一个字符串,cin 将失败(并且它的失败位将被触发,导致 false ) 并且根据上面的 if 语句不会显示任何内容。

于 2020-05-14T08:34:19.947 回答