for循环是否在每次迭代中重新评估其体内的函数?

Spi*_*ico 1 c c++ java for-loop

当我像这样编写一个简单的for循环时

for (int i = 0; i < myList.size(); i++){}
Run Code Online (Sandbox Code Playgroud)

在Java,C和C++中,它是在每次迭代中重新评估myList.size()还是在循环开始时重新评估一次?如果它重新评估,是否预先评估大小,即

int n = myList.size();
for (int i = 0; i < n; i++){}
Run Code Online (Sandbox Code Playgroud)

在性能方面给我们一些重要的东西?

Gho*_*ica 7

对于Java:

for (int i=0; i<myList.size(); i++){}
Run Code Online (Sandbox Code Playgroud)

在每次循环迭代期间评估条件; 所以通过将该调用移到size()循环前面可以获得轻微的性能提升.

但在Java中你应该更喜欢for-each

for (Whatever thingy : list)
Run Code Online (Sandbox Code Playgroud)

无论如何(尽可能).

您可以在Java语言规范第14.14.1节中阅读.


dbu*_*ush 5

在C和C++中,控制表达式在循环的每次迭代中计算.

从C标准的 6.8.5.3节:

该声明

for (clause-1; expression-2; expression-3) statement
Run Code Online (Sandbox Code Playgroud)

表现如下: 表达式expression-2是在每次执行循环体之前计算的控制表达式.expression-3在每次执行循环体后 ,表达式被计算为void表达式.如果 clause-1是声明,它声明的任何标识符的范围是声明的剩余部分和整个循环,包括其他两个表达式; 它是在控制表达式的第一次评估之前按执行顺序到达的.如果clause-1是表达式,则在第一次控制表达式求值之前将其计算为void表达式.

C++标准的 6.5.3节包含类似的措辞.

因此,如果您的控制表达式涉及函数调用或其他可能在循环体中不会更改的潜在昂贵计算,则应事先对其进行评估,将其存储在变量中,然后在控制表达式中使用该变量.