C++函数问题中的 IF 语句

C++ IF Statement inside a function issue

本文关键字:IF 语句 函数 问题 C++      更新时间:2023-10-16

我在C++类的基本程序上遇到了一些麻烦。在下面的函数中,我已经进行了调试并且传入的参数是正确的,但是下面的 if 语句为我传入的数组的第一个元素返回"F",而我传入的第二个和此后的每个分数都返回为"D"。

当我进行数学运算时,我的数据集应该至少点击一次 if 语句的每个部分,但是我猜我的 PEMDAS 可能关闭了?

下面是 if 语句:

char grade(double score, double m, double s) {
if (score < (m - 1.5 * s)) {
return 'F';
}
if ((m - (1.5*s)) <= score < (m - (0.5 * s))) {
return 'D';
}
if ((m - (0.5 * s)) <= score < (m + (0.5 * s))) {
return 'C';
}
if ((m + (0.5 * s)) <= score < (m + (1.5 * s))) {
return 'B';
}
if ((m + (1.5 * s)) <= score) {
return 'A';
}
else {
return 'X';
}
}

表达式如下:

a < b < c

不做你认为它做的事情。它实际上评估为:

(a < b) < c

其中a < b是一个真值,0为假,1为真'。然后,该值将用于表达式的其余部分。

例如,表达式100 < 200 < 42将为真,因为100 < 200计算结果为1,这绝对小于42

相反,您应该使用类似的东西:

(a < b) && (b < c)

无论如何,您可以通过意识到以下内容来清理该代码:

  1. 构造if (condition) return else ...是完全不必要的 -return意味着代码的其余部分只有在condition为 false 时才执行,从而使else变得多余。

  2. 由于您的范围是互斥的,因此可以简化检查。换句话说,无需检查(m - (1.5*s)) <= scoreD情况下是否为,因为如果不是这样,代码已经返回F

  3. 目前不可能获得X分,因为没有分数不被if语句之一捕获,除了可能NaN这样的一些边缘情况,但我假设你不担心这一点。

考虑到这些要点,代码可以简化为:

char grade(double score, double m, double s) {
if (score < m - 1.5 * s) return 'F';
if (score < m - 0.5 * s) return 'D';
if (score < m + 0.5 * s) return 'C';
if (score < m + 1.5 * s) return 'B';
return 'A';
}

我们需要知道输入数据值才能完全理解,但是正如其他人指出的那样,比较在C++中不起作用。

做这个比较: (米 - (1.5*秒)) <= 得分 <(米 - (0.5 * 秒))

这首先要做的是评估: (米 - (1.5*秒)) <= 分数

由于第一个 if 语句失败,这将始终计算为 true。 在C++中,布尔值是整数,true通常由"1"表示(实际上不必如此,并且可以由任何非零数表示,但我认为在这种特定情况下,它被设置为1)。

然后它评估: 1 <(米 - (0.5*秒))

我假设给定您的"m"和"s"值总是返回 true。

相反,您应该做的是使用复合语句:

if (m - 1.5*s <<p>= 得分 &&得分

(如果您愿意,可以保留括号,但由于C++运算符优先级规则,此处不需要括号)

只需删除所有下限比较(正如其他人所说,不要按照您的想法进行):如果其中任何一个不适用,您已经返回了一个较低的分数。