是变量初始化失败?
Is it variable initialization failure?
正在按照 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 章) 所建议的,它输出一个字符串,让我们熟悉 name和一个人的年龄。因为我已经将 整数变量 age 初始化为 -1,程序必须 return -1 到监视器,以防万一,输入一个 字符串值 到 年龄。问题是它不会在我的电脑上发生。我已经尝试并编译 运行 程序 19 次(我确实记得......)但结果总是一样的:它输出 0 而不是 -1。
例如如果我输入 ABCXYZ 16
,那么输出将是一个漂亮而简单的 Hello, ABCXYZ (age 16)。但是如果输入是 16 ABCXYZ
,那么输出结果是 Hello, ABCXYZ (age 0),我预计是 Hello, ABCXYZ ( age -1) 因为字符串 ABCXYZ
不会被读入 age(它是一个整数变量),因此给出了初始化值,因为它没有被覆盖。
有什么想法吗?
P.S.: 我正在使用 Code:Blocks 和 GCC - 8.1.0
std::istream& operator>>(int &value)
在内部调用 std::num_get::get()
。从 cppreference std::num_get::get() 开始,c++11 中的行为发生了变化。
用 v
表示我们读入的变量,直到 c++11 我们有:
- If an error occurs, v is left unchanged.
但是从 c++11 开始:
If the conversion function fails to convert the entire field, the
value 0 is stored in v
If the conversion function results in a
positive or negative value too large to fit in the type of v which is
a signed integer type, the most positive or negative representable
value is stored in v, respectively
If the conversion function results
in a value not to fit in the type of v which is an unsigned integer
type, the most positive representable value is stored in v.
您正在使用配置为与c++11之后的标准兼容的编译器和C++标准库进行编译,因此当std::cin
无法读取该字段时,0
的值为存储到 age
.
此问题与 >>
运算符有关,它无法将您的字符串输入转换为整数(这是预期的,因为 std::cin >> x
处理预期的输入,来自您定义的类型x
),因此 return 为 0,无论您用什么值初始化整数变量。
正如 Kamil 提到的那样,这是自 C++ 11 以来完成的,并且符合以前的标准,该值将保持不变并且 return 对于您的情况将是 -1。
您可以查看cin
是失败还是通过,自己得出结论:
int main()
{
int age = -1;
std::cin >> age;
if(cin)
std::cout << age;
}
如果你输入一个整数(正如 age
的类型所预期的那样),你会得到你初始化它的年龄值的输出,否则如果你输入一个字符串,cin 将失败(并且它的 failbit 将被触发,导致 false) 并且根据上面的 if 语句什么都不会显示。
正在按照 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 章) 所建议的,它输出一个字符串,让我们熟悉 name和一个人的年龄。因为我已经将 整数变量 age 初始化为 -1,程序必须 return -1 到监视器,以防万一,输入一个 字符串值 到 年龄。问题是它不会在我的电脑上发生。我已经尝试并编译 运行 程序 19 次(我确实记得......)但结果总是一样的:它输出 0 而不是 -1。
例如如果我输入 ABCXYZ 16
,那么输出将是一个漂亮而简单的 Hello, ABCXYZ (age 16)。但是如果输入是 16 ABCXYZ
,那么输出结果是 Hello, ABCXYZ (age 0),我预计是 Hello, ABCXYZ ( age -1) 因为字符串 ABCXYZ
不会被读入 age(它是一个整数变量),因此给出了初始化值,因为它没有被覆盖。
有什么想法吗?
P.S.: 我正在使用 Code:Blocks 和 GCC - 8.1.0
std::istream& operator>>(int &value)
在内部调用 std::num_get::get()
。从 cppreference std::num_get::get() 开始,c++11 中的行为发生了变化。
用 v
表示我们读入的变量,直到 c++11 我们有:
- If an error occurs, v is left unchanged.
但是从 c++11 开始:
If the conversion function fails to convert the entire field, the value 0 is stored in v
If the conversion function results in a positive or negative value too large to fit in the type of v which is a signed integer type, the most positive or negative representable value is stored in v, respectively
If the conversion function results in a value not to fit in the type of v which is an unsigned integer type, the most positive representable value is stored in v.
您正在使用配置为与c++11之后的标准兼容的编译器和C++标准库进行编译,因此当std::cin
无法读取该字段时,0
的值为存储到 age
.
此问题与 >>
运算符有关,它无法将您的字符串输入转换为整数(这是预期的,因为 std::cin >> x
处理预期的输入,来自您定义的类型x
),因此 return 为 0,无论您用什么值初始化整数变量。
正如 Kamil 提到的那样,这是自 C++ 11 以来完成的,并且符合以前的标准,该值将保持不变并且 return 对于您的情况将是 -1。
您可以查看cin
是失败还是通过,自己得出结论:
int main()
{
int age = -1;
std::cin >> age;
if(cin)
std::cout << age;
}
如果你输入一个整数(正如 age
的类型所预期的那样),你会得到你初始化它的年龄值的输出,否则如果你输入一个字符串,cin 将失败(并且它的 failbit 将被触发,导致 false) 并且根据上面的 if 语句什么都不会显示。