为什么 C++ 数学运算接受一个字母作为输入并输出一个数字?
Why does a C++ mathematical operation accept a letter as an input and output a number?
我是 c++ 的新手,所以这可能是一个愚蠢的问题,但我编写了一个非常简单的温度转换程序。它看起来像这样:
#include <iostream>
int main() {
double tempf;
double tempc;
// Ask the user
std::cout << "Enter the temperature in Fahrenheit: ";
std::cin >> tempf;
// Conversion
tempc = (tempf - 32) / 1.8;
// Print Output
std::cout << "The temp is " << tempc << " degrees Celsius.\n";
}
当我输入 integer/float 作为输入时,它编译并运行良好。然而,出于好奇,我试着输入一封信,以为会出现错误或某种失败。相反,在编译之后,我得到了这个输出:
$ g++ temperature.cpp -o temp
$ ./temp
Enter the temperature in Fahrenheit: abc
The temp is -17.7778 degrees Celsius.
谁能告诉我可执行文件从哪里获取输出 -17.7778
?这似乎是一个任意数字,而不是数学输出。
“但是,出于好奇,我尝试输入一封信,以为会出现错误或某种失败。”
默认情况下,std::cin
通过设置必须手动检查的内部错误位来报告错误。一种机制是使用 good()
成员函数来检查任何错误位。另一种是使用做同样事情的 bool
转换运算符,它会转换为 true
如果没有设置错误位,否则它会转换为 false
.
示例:
if(!std::cin) {
std::cout << "Input error!";
return;
}
当std::cin
失败时,它会将值0赋给变量。
来自 cppreference.com :
If extraction fails (e.g. if a letter was entered where a digit is expected), zero is written to value and failbit is set.
当您提供输入 "abc"
时,表达式 std::cin >> tempf;
将无法读取任何内容,将 0
分配给 tempf
并设置一个失败位。然后,在 tempc = (tempf - 32) / 1.8;
期间计算的值将是 (0.0 - 32) / 1.8
,这大约是 -17.7778
,这是您观察到的结果。
您可以使用 exceptions
成员函数更改默认行为以在失败时抛出异常。但请注意,如果您项目的其他部分使用 std::cin
并且不要期望此更改,它可能会破坏他们的错误处理方案,该方案可能依赖于检查错误位。
本例cppreference.com提供的例子:
#include <iostream>
#include <fstream>
int main()
{
int ivalue;
try {
std::ifstream in("in.txt");
in.exceptions(std::ifstream::failbit); // may throw
in >> ivalue; // may throw
} catch (const std::ios_base::failure& fail) {
// handle exception here
std::cout << fail.what() << '\n';
}
}
我是 c++ 的新手,所以这可能是一个愚蠢的问题,但我编写了一个非常简单的温度转换程序。它看起来像这样:
#include <iostream>
int main() {
double tempf;
double tempc;
// Ask the user
std::cout << "Enter the temperature in Fahrenheit: ";
std::cin >> tempf;
// Conversion
tempc = (tempf - 32) / 1.8;
// Print Output
std::cout << "The temp is " << tempc << " degrees Celsius.\n";
}
当我输入 integer/float 作为输入时,它编译并运行良好。然而,出于好奇,我试着输入一封信,以为会出现错误或某种失败。相反,在编译之后,我得到了这个输出:
$ g++ temperature.cpp -o temp
$ ./temp
Enter the temperature in Fahrenheit: abc
The temp is -17.7778 degrees Celsius.
谁能告诉我可执行文件从哪里获取输出 -17.7778
?这似乎是一个任意数字,而不是数学输出。
“但是,出于好奇,我尝试输入一封信,以为会出现错误或某种失败。”
默认情况下,std::cin
通过设置必须手动检查的内部错误位来报告错误。一种机制是使用 good()
成员函数来检查任何错误位。另一种是使用做同样事情的 bool
转换运算符,它会转换为 true
如果没有设置错误位,否则它会转换为 false
.
示例:
if(!std::cin) {
std::cout << "Input error!";
return;
}
当std::cin
失败时,它会将值0赋给变量。
来自 cppreference.com :
If extraction fails (e.g. if a letter was entered where a digit is expected), zero is written to value and failbit is set.
当您提供输入 "abc"
时,表达式 std::cin >> tempf;
将无法读取任何内容,将 0
分配给 tempf
并设置一个失败位。然后,在 tempc = (tempf - 32) / 1.8;
期间计算的值将是 (0.0 - 32) / 1.8
,这大约是 -17.7778
,这是您观察到的结果。
您可以使用 exceptions
成员函数更改默认行为以在失败时抛出异常。但请注意,如果您项目的其他部分使用 std::cin
并且不要期望此更改,它可能会破坏他们的错误处理方案,该方案可能依赖于检查错误位。
本例cppreference.com提供的例子:
#include <iostream>
#include <fstream>
int main()
{
int ivalue;
try {
std::ifstream in("in.txt");
in.exceptions(std::ifstream::failbit); // may throw
in >> ivalue; // may throw
} catch (const std::ios_base::failure& fail) {
// handle exception here
std::cout << fail.what() << '\n';
}
}