在代码中,我使用表达式树"3 + 2.53 - 1.75"
,该树应返回3.78
的结果。但是,它最终将字符串中的所有值相加并输出7.28
。我在纸上多次浏览了该代码,试图查看在使用索引变量i
和distance_operator
的for循环的每次迭代中发生了什么。据我了解,我找不到程序继续添加每个浮点值的原因。到'-'
字符时,它应该减去下一个值。
distance_operator
曾经是第一个操作符的偏移量,索引i
将被旋转,这样我就可以使用该字符串的一部分并使用substr()函数对其进行计算。
float total = (float)value(expression[0]);
int distance_operator;
for (i = 1; i < expression.size(); i++) {
if (expression[i] == '+' || expression[i] == '-') {
distance_operator = i + 1;
while (expression[distance_operator] != '+' || expression[distance_operator] != '-') {
distance_operator++;
if (distance_operator == expression.size())
break;
}
if (expression[i] == '+')
total += std::stof(expression.substr(i, distance_operator - i));
else if(expression[i] == '-')
total -= std::stof(expression.substr(i, distance_operator - i));
}
}
答案 0 :(得分:5)
该代码几乎是正确的,但是存在“一对一”错误。
问题是,当找到-
时,使用正确的子字符串将"- 1.75"
解析为数字时会带有负值,基本上,您会减去否定您要使用的值。累积代码应为:
if (expression[i] == '+')
total += std::stof(expression.substr(i+1, distance_operator-i-1));
else if(expression[i] == '-')
total -= std::stof(expression.substr(i+1, distance_operator-i-1));
请注意,由于使用的是i+1
,因此找到的表达式符号将被跳过。
答案 1 :(得分:1)
还请注意,此检查
while (expression[distance_operator] != '+' || expression[distance_operator] != '-')
将始终为真,因为事物总是不同于A或不同于B。正确的逻辑运算符为&&。