是变量初始化失败吗?

问题描述 投票:0回答:1

正在按照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章输入和类型部分) 建议,它输出了一个字符串,让我们熟悉了 名称年龄 的人。由于我已经初始化了 整数变量 年龄-1,程序必须返回 -1 如果我不小心输入了错误的信息,我就会将该信息发送到显示器上。串值 变成 年龄. 问题是,在我的电脑中,它不会发生。我试着编译并运行了19次程序(我确实记得......),但结果总是一样:它输出的是 0而不是-1.

例如,如果我输入 ABCXYZ 16,然后输出将是一个漂亮而简单的 你好,ABCXYZ(16岁). 但如果输入的是 16 ABCXYZ,那么输出的结果是 你好,ABCXYZ(0岁)我以为会是 你好,ABCXYZ(年龄 -1) 作为字符串 ABCXYZ 不读 年龄 (它是一个 整数变量),从而给出初始化的值,因为它没有被覆盖。

有什么办法吗?

P.S.: 我使用的是 GCC - 8.1.0 的 Code:Blocks。

c++ variables variable-initialization
1个回答
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++标准库进行编译,并将其配置为与c++11之后的标准兼容,所以当 std::cin 未能读取该字段,则 0 被存储到 age.


1
投票

该问题仅涉及以下方面: >> 操作符,它无法将你的字符串输入转换为整数(这是预期的,如 std::cin >> x 处理预期的输入,来自你为 x),因此不管你用什么值来初始化这个整数变量,都会返回一个0。

正如Kamil所提到的,从C++ 11开始就这样做了,按照以前的标准,这个值会保持不变,并且对你的情况会返回一个-1。

你可以检查 cin 失败或通过,自己得出结论。

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

如果你输入了一个整数(从类型上看,你的输入应该是整数) age)你会得到你初始化的年龄值的输出,否则如果你输入一个字符串,cin会失败(它的failbit会被触发,导致false),按照上面的if-statement,什么都不会显示。

© www.soinside.com 2019 - 2024. All rights reserved.