为什么从输入收集字符串时整数输出为0 我是C++新手,我通过StruouStrup编程原理和实践来工作。在第3.3节中,他给出了以下示例: #include <iostream> #include <string> int main() { std::cout << "Please enter your first name and age\n"; std::string firstName; int age; std::cin >> firstName >> age; std::cout << "Hello, " << firstName << " (age " << age << ")\n"; }

为什么从输入收集字符串时整数输出为0 我是C++新手,我通过StruouStrup编程原理和实践来工作。在第3.3节中,他给出了以下示例: #include <iostream> #include <string> int main() { std::cout << "Please enter your first name and age\n"; std::string firstName; int age; std::cin >> firstName >> age; std::cout << "Hello, " << firstName << " (age " << age << ")\n"; },c++,std,stdin,cin,stdstring,C++,Std,Stdin,Cin,Stdstring,我希望输出是“Hello,22(age-1)”,如文本中所述,但得到的是“Hello,22(age-0)”。为什么?将age设置为0的原因是(假设您使用的是c++11或更高版本): 如果提取失败(例如,如果输入了数字所在的字母 预期),该值保持不变,并设置failbit。(直到C++11) 如果提取失败,则将零写入值并设置故障位。 (自C++11以来) 顺便说一句,VC++编译器直到最近才遵循这个标准,因为STL的操作符>的实现显式地将无效的int输入设置为0。这是允许的,尽管该行为在C++11

我希望输出是“Hello,22(age-1)”,如文本中所述,但得到的是“Hello,22(age-0)”。为什么?

age
设置为
0
的原因是(假设您使用的是c++11或更高版本):

如果提取失败(例如,如果输入了数字所在的字母 预期),该值保持不变,并设置failbit。(直到C++11)

如果提取失败,则将零写入值并设置故障位。 (自C++11以来)


顺便说一句,VC++编译器直到最近才遵循这个标准,因为STL的
操作符>
的实现显式地将无效的int输入设置为0。这是允许的,尽管该行为在C++11之前是未定义的,但在C++11及更高版本中是有保证的。只需检查如何从由于无效输入而导致的流失败状态中恢复。@πάνταῥεῖ 这不是一个重复的问题。我在问为什么书和实际输出之间存在差异,相关问题是问是否有人使用提取操作符。完全不同。不管是谁把这个问题作为复本结束,都没有读复本的答案,因为他们都没有回答这个问题。所以我重新开始这个问题。你可以在问之前参考一下,对不起。
string firstName = "???";
int age = -1;