例如,我们的代码如下:
for (i = 0; i < function(); ++i )
{
// loop body;
}
函数()会在每次循环中求值吗?
是。它将在循环的每次迭代中求值。这肯定是因为每次调用函数都有可能返回不同的值。此外,调用该函数可能会产生副作用(例如,更改变量的值或写入文件)。编译器不能假定不是这样。如果不需要这种行为,可以使用for循环语法只进行一次计算:
for (i = 0, len=function(); i < len; ++i )
{
// loop body;
}
更新:
一些人注意到,在某些边缘情况下,编译器可以优化多次调用:例如,c++中的const或内联函数没有副作用,或者JVM可以推断出函数是可重复的并且没有副作用。但是如果你想要一个保证,而不是依赖于编译器可能为你做的事情,我仍然推荐上面提到的for循环语法。
是的,三种语言都有。
为了避免这种情况,您可以将function()
的结果放入一个变量中:
int funcVal = function();
for (i = 0; i < funcVal; ++i) {
// ...
}
编译器/JVM不能为您优化这一点(除了在某些微不足道的情况下),因为function()
可能有副作用,例如打印到控制台。
看情况。
在大多数情况下,函数将被调用多次。
然而:在c++中,如果它是一个非常简单的函数并使'inline',那么很可能那里确实没有函数调用。
而在Java中,如果同样简单,VM的JIT可能会对其进行优化,以减少不必要的调用。
类似于@Cameron的回答,你可以写
for(int i = 0, funcVal = function(); i < funcVal; ++i) {
// ...
}
正如@RollingBoy所建议的,函数()可以在c++(由编译器)和Java(由JVM)中内联,并可能进行优化,因此它不会被计算多次。