【发布时间】:2020-05-06 13:50:15
【问题描述】:
我有一些如下所示的代码。我已经简化了它以表达我的观点。它包含一个数组。在第一部分中,数组的每个值减去某个值应与边距值进行比较。 如果满足所有条件,µC 应该停止运行一个简单的函数。 否则,µC 应该使用数组的值进行计算。此计算对每个值都有一些乘法运算。
uint32_t value[8];
uint16_t othervalue;
if ((value[0] < othervalue && value[1] < othervalue && value[2] < othervalue && value[3] < othervalue && value[4] < othervalue && value[5] < othervalue && value[6] < othervalue && value[7] < othervalue)
{
othervalue = 100;
simplefunction();
}
else
{
calculatewithallvalues(values);
}
我注意到我可能会改进代码。仅当不满足该特定值的条件时才需要进行“else”中的计算。因此,在某些情况下,不必对每个值都进行计算。我想出了一个使用 for 循环的不同方法。但是,此代码更长,可能更令人困惑。最后需要额外的 if 循环来说明所有值都满足条件的可能性。
uint32_t value[8];
uint16_t othervalue;
uint8_t calc_needed = 0;
int i;
for (i=0; i <7; i++)
{
if (value[i] < othervalue)
{
//do nothing
}
else
{
calculatewithvalue(values[i]);
calc_needed = 1;
}
if (calc_needed == 0)
{
othervalue = 100;
simplefunction();
}
哪个是更好的解决方案还是有第三种解决方案?
【问题讨论】:
-
第一个解决方案不好,因为语句超出了屏幕的一侧。
-
撇开 Fiddleling 的愚蠢评论 :) - 恕我直言,您的第一个选择就是这样做,即使阅读和写作有点乏味。确保对它重新排序以使最有可能在表达式中预先失败的测试。
-
那么,您的
calculatewithvalue()函数有多复杂?任何特定测试失败并导致执行calculatewithallvalues()的可能性有多大?如果每次计算都很昂贵,并且很可能其中一个条件会失败(但不是全部),那么您的第二个版本应该更快。 -
@500-InternalServerError 如果主要问题是计算本身,优化 if 条件可能不会产生明显的差异。第一个示例将始终重新计算所有内容,无论是仅满足一个条件还是满足所有条件。第二种方法只会重新计算严格必要的内容。
-
1) 第二个片段中缺少
break;。 2)calculatewithvalue(values[i]);不同于calculatewithvalues(values);
标签: c loops for-loop microcontroller