每次都是在for循环的条件语句中执行函数吗?

Spa*_*ngh 1 c++ java for-loop

如果我有这样的for循环:

for(int i = 0; i < getInt(); i++){//code}
Run Code Online (Sandbox Code Playgroud)

每次for循环检查时是否会执行getInt():

i < getInt();
Run Code Online (Sandbox Code Playgroud)

或者它会在最开始执行一次并返回一个值j,以便for循环可以检查是否:

i < j;
Run Code Online (Sandbox Code Playgroud)

我想知道的特定语言是Java,但如果答案在其他语言中有所不同,我也想知道.

Ant*_*ois 6

是的,它将在每个循环中执行.

基本上,执行是这样的:

  1. for条件的第一部分执行一次
  2. 第二部分进行评估,如果它true是循环体执行的话.否则,请转到循环后的语句.
  3. 执行主体后,执行第三部分(i++此处)
  4. 2.

对于第二部分(延续条件)而言,每次都不能进行全面评估是没有意义的.如果循环体中的某些东西导致getInt()迭代之间返回不同的值会怎么样?

当然,编译器可以自由地围绕常量表达式和其他一些可以证明的事情进行优化.例如,如果getInt()定义如下:

public int getInt() {
  return 4;
}
Run Code Online (Sandbox Code Playgroud)

你的编译器可以

  1. 发出相当于的代码 for(int i = 0; i < 4; i++) { //body }
  2. 取下环路,只需进行必要的调整,就可以将环体放出4次
  3. 不关心并发出未优化的代码.

在某些情况下getInt()实际上会被调用,在其他情况下则不会.在所有情况下,您的编译器都是正确的,因为它只会执行转换,导致代码行为与未执行转换时完全相同.