为什么 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';
    }
}