是变量初始化失败吗?
Is it variable initialization failure?
遵循Bjarne Stroustrup的"使用C++的编程原理和实践"一书,从最基本的开始学习C++。在这件事发生之前,一切都被证明是好的......
int main()
{
cout << "Please enter your first name and agen";
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
,那么输出将是一个漂亮而简单的你好,ABCXYZ(16 岁(。但是如果输入是16 ABCXYZ
,那么输出结果是Hello,ABCXYZ(年龄0(,我预计是Hello,ABCXYZ(年龄-1(,因为字符串ABCXYZ
不会被读入年龄(它是一个整数变量(,因此给出初始化的值,因为它没有被覆盖。
知道吗?
附言:我正在使用代码:块与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++配置为与 c++11 之后的标准兼容的标准库进行编译,因此当std::cin
无法读取字段时,0
的值将存储到age
中。
该问题与>>
运算符隔离,它无法将您的字符串输入转换为整数(这是预期的,因为std::cin >> x
处理预期的输入,来自您为x
定义的类型(,因此返回 0,无论您使用什么值初始化整数变量。
正如 Kamil 所提到的,这是从 11 C++开始完成的,并且符合以前的标准,该值将保持不变,并且对于您的情况将返回 -1。
您可以检查cin
是否失败或通过,以自己得出结论:
int main()
{
int age = -1;
std::cin >> age;
if(cin)
std::cout << age;
}
如果你输入一个整数(正如age
类型所预期的那样(,你会得到你初始化它的年龄值的输出,否则如果你输入一个字符串,cin 将失败(它的失败位将被触发,导致 false(,并且不会显示任何内容,根据上面的 if 语句。
- 是变量初始化失败吗?
- thread_local静态成员模板定义:初始化失败,GCC
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 为什么部分初始化一个类然后调用委托 ctor 失败?
- Eclipse:错误:初始化模式失败(无法连接到目标)
- 嵌套列表(字符串向量的向量)初始化失败
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- 使用初始值设定项列表初始化结构,对于 std::array 失败
- 向量初始化在 C++ 类中失败
- 为什么"new"在类初始化中失败
- CRTP自动注册工厂(静态初始化顺序失败)
- 在分配的结构中初始化 std::map 在 Windows 上失败
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- C++中的即时对象初始化失败,出现LNK2005错误
- GLEW 初始化失败
- OpenCV 中的相机初始化失败
- 尝试使用 uint*& 作为常量单元*&失败:从类型"uint8_t"的表达式初始化类型"const uint8_t*&"的引用无效
- 为什么初始化COM库失败
- C++全局对象初始化失败——为什么?以及是否可以将对象放入.DATA部分
- c++静态初始化失败示例