【发布时间】:2020-05-14 08:13:20
【问题描述】:
遵循 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 如果我在 age 中输入了一个 字符串值 以防万一。问题是它不会发生在我的电脑上。我已经尝试编译并运行了 19 次程序(我确实记得...),但结果始终相同:它输出 0 而不是 -1。
例如如果我输入ABCXYZ 16,那么输出将是一个漂亮而简单的你好,ABCXYZ(16 岁)。但是如果输入是 16 ABCXYZ,那么输出结果是 Hello, ABCXYZ (age 0),我预计会是 Hello, ABCXYZ (age -1) 作为字符串ABCXYZ 不会被读入age(它是一个整数变量)和因此给出初始化值,因为它没有被覆盖。
有什么想法吗?
P.S.:我正在使用 Code:Blocks 和 GCC - 8.1.0
【问题讨论】:
-
您正在阅读的版本是多少?这个细节在 c++11 中改变了。请考虑 rtfm(阅读精美手册)。例如这里:en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt
-
旧的行为在我看来总是更合乎逻辑。不知道为什么会改变。
-
从您的问题中删除不必要的代码和文本。
int age = -1; std::cin>>age; std::cout<<age;就足够了。 -
@john 同样在这里,我真的很困惑动机是什么。以前是 UB 而现在不再是 UB 的代码很可能仍然是错误的
-
@idclev463035818 上面写着第二版。封面提到这本书使用了 C++11 和 C++14
标签: c++ variables variable-initialization