我在使用C ++类的基本程序时遇到了一些麻烦。在下面的函数中,我已经调试并且传入的参数是正确的,但是下面的if语句为我传入的数组的第一个元素返回'F',而我传入的第二个和后面的分数是以'D'返回。
当我进行数学计算时,我的数据集应该至少触及一次if语句的每一部分,但是我猜测我的PEMDAS可能已经关闭了吗?
这是if语句:
route add ec2InstanceIP mask 255.255.255.255 AlternateNetworkgateway METRIC 10
答案 0 :(得分:2)
表达式如下:
a < b < c
不符合您的想法。它实际上评估为:
(a < b) < c
其中a < b
是真值,其中0
表示false,1
表示true。然后 值用于表达式的其余部分。
举例来说,表达式100 < 200 < 42
将为真,因为100 < 200
的计算结果为1
,绝对小于42
。
相反,你应该使用类似的东西:
(a < b) && (b < c)
在任何情况下,您都可以通过以下方式清理该代码:
构造if (condition) return else ...
完全没必要 - return
表示只有当condition
为false时才会执行其余代码,导致else
多余
由于您的范围是互斥的,因此可以简化检查。换句话说,无需检查(m - (1.5*s)) <= score
案例中是否D
,因为如果不是这样,则代码已经返回F
。
目前无法获得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';
}
答案 1 :(得分:0)
我们需要知道输入数据值才能完全理解,但正如其他人所指出的那样,比较不像C ++那样有效。
进行比较: (m - (1.5 * s))&lt; =得分&lt; (m - (0.5 * s))
这样做首先评估: (m - (1.5 * s))&lt; =得分
由于第一个if语句失败,因此总是会计算为true。在C ++中,布尔值是整数,而true通常用“1”表示(实际上它不必是,并且可以用任何非零数字表示,但我认为在这个特定情况下它被设置为1)。
然后它正在评估: 1&lt; (m - (0.5 * s))
考虑到你的“m”和“s”值,我假设总是返回true。
你应该做的是使用复合语句:
if(m - 1.5 * s&lt; =得分&amp;&amp;得分&lt; m - 0.5 * s)
(如果你愿意,可以保留括号,但由于C ++的operator precedence rules,这里不需要它们)
答案 2 :(得分:0)
只需删除所有下限比较(正如其他人所说的那样,不按照您的想法行事):如果其中任何一个不适用,您就已经返回了较低分数之一。