C/ c++ /Java问题:for循环中使用的表达式会计算多次吗?



例如,我们的代码如下:

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)中内联,并可能进行优化,因此它不会被计算多次。

最新更新