效率更高?为什么呢?
选项1:
int n = someFunction();
for (int i = 0; i < n ; i++)
//do something...
选项2:
for (int i = 0; i < (someFunction()); i++)
//do something...
提前感谢您的回复!
答案 0 :(得分:6)
这两个循环甚至不等同:如果someFunction()
在多次调用时预期会返回不同的值,结果会有所不同。
当someFunction()
返回相同的值时,无论您调用多少次,当someFunction()
返回大于或等于1
的数字时,第一个选项会更有效率。如果它返回0
,则没有区别。
时间差异来自于第二个选项在循环中重复调用someFunction()
以获得限制。即使函数调用非常快,此代码也是次优的
答案 1 :(得分:5)
前者总是至少和后者一样有效。对于前者,您只评估someFunction
一次。对于后者,你在每次迭代时都会调用它。
智能编译器可能能够在后一种情况下内联someFunction
的主体,并意识到它可能是一个常量,使其实际上相等,但第一个永远不会慢。
有时我会做这样的事情,借用JavaScript的约定:
for(size_t i = 0, l = someFunction(); i < l; i++) {
// ...
}
这与第一个版本实际上是相同的,除了比第二个更简洁。
答案 2 :(得分:2)
对于SomeFunction()
在第一次调用时返回大于零的值的一般情况,选项1对someFunction()
的调用次数减少。因此,它会更有效率。
除非编译器能够看到someFunction()
的主体,否则无法优化选项2,并且可以确定无论...do something...
代码中发生什么,它都将始终返回相同的值。
答案 3 :(得分:0)
第一个更高效,因为它只检查someFunction一次。在第二个中,对于每个循环,它一遍又一遍地检查someFunction()
答案 4 :(得分:0)
如果someFunction()
的输出不随时间变化,则选项1更有效。
答案 5 :(得分:0)
首先,选项1的语法错误,for
循环缺少正确的括号。所以这不会编译。
第二,选项2肯定更贵,而且可能完全错误,因为你反复调用someFunction()
,而不是一次调用它并使用返回的值来限制。{/ p>
答案 6 :(得分:0)
第一个是高效的,因为它与一个常数进行比较以评估for循环条件,但是第二个for循环在每次迭代时评估someFunction()。