【问题标题】:C++: Not recognizing char value when evaluating if statementC++:评估 if 语句时不识别 char 值
【发布时间】:2018-03-16 12:23:02
【问题描述】:

每次我运行此代码时,无论出于何种原因,它都会调用所有函数,无论 if 语句的计算结果是否为 true

int main()
 {
 char StartUnit, EndUnit;
  double StartVal = 0, EndVal = 0;
  double CalcVal = 0;
  static double result = 0;

  //Receive user input

  cout << "Please enter the unit which you would like to convert from: ";
  cin >> StartUnit;
  cout << "What is your initial value?: ";
  cin >> StartVal;
  cout << "Please enter the unit which you would like to convert to: ";
  cin >> EndUnit;

  //Step 1: Convert input to celsius

  if (StartUnit = 'f')
  {
  CalcVal = FarCel(StartVal);
  }

  if (StartUnit = 'k')
  {
  CalcVal = KelCel(StartVal);
  }

  if (StartUnit = 'r')
  {
  CalcVal = RakCel(StartVal);
  }

  //Step 2: Conver celsius to desired value

  cout << CalcVal;

  return 0;
}

当我输出CalcVal时,无论如何,它似乎贯穿了所有三个函数。不管我输入什么,r、c、f,它们的评价都是一样的。我可以就我哪里出错了提供一些建议吗?


已解决:问题的答案是==用于比较,我的if测试使用=

【问题讨论】:

  • 如果您的教授不能立即发现明显的错误并给出解释,正如您所说,您真的需要找一位新教授。你得到的那个是完全无能的。
  • 把你的编译器的警告级别调高到足够高,它很有可能会因为 ==/= 混淆而向你发出血腥的蓝色谋杀。 Visual Studio 中的第 4 级并将 -Wall -Wextra 添加到 g++ 命令行应该可以完成这项工作。
  • 这个问题有答案,请选择一个作为接受答案。
  • @SamVarshavchik 这值得商榷。另一方面,编译器应该绝对警告这一点。

标签: c++ function if-statement char comparison


【解决方案1】:

因为您似乎分配了值 (=),而不是检查它们 (==)。此外,您应该使用else if 块,以便更好地阅读。

【讨论】:

  • 原来如此 - 非常感谢!容易监督,初学者。显然我的教授也是:P
【解决方案2】:

你所有的 if 语句 assing (=),而不是 comparing (==)。

所以,改变这个:

if (StartUnit = 'f')

到这里:

if (StartUnit == 'f')

并对其余的 if 语句执行类似操作。

【讨论】:

    【解决方案3】:

    C++ 的三个特性共同产生了这个问题:

    1. 在 C、C++ 和许多相关语言中,=(单个等号)和==(两个等号一起)之间存在差异。第一个是赋值,第二个是比较。 StartUnit = 'f' 表示“将 StartUnit 设置为值 'f'”;你的意思是使用StartUnit == 'f'
    2. 在很多语言中,赋值实际上是一个表达式,也有一个值。在这种情况下,它是分配的值,因此StartUnit = 'f' 表示“将StartUnit 设置为f,并返回值'f'”。因为它在if 语句中,所以既设置了StartUnit,又设置了if ('f')
    3. if 语句或其他布尔运算查看intfloatchar 等时,它会检查它们是否非零。由于'f' 不是Nul 字节'\x00''0' 也不是),因此它的计算结果为真并执行if 语句体。

    由于所有这些if 语句的工作方式相同,因此所有这些语句都会发生这种情况并且所有函数都会运行。


    您可能还想使用else 子句,甚至是switch 语句。一堆if 语句,一个接一个,看起来好像没有一个、任何一个或全部可以运行。由于您希望只有一个发生,您应该使用 else 块或 switch 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多