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

时间:2015-09-26 03:46:27

标签: java c++ for-loop

如果我有这样的for循环:

for(int i = 0; i < getInt(); i++){//code}

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

i < getInt();

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

i < j;

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

1 个答案:

答案 0 :(得分:6)

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

基本上,执行是这样的:

  1. for条件的第一部分执行一次
  2. 如果循环体执行true,则评估第二部分。否则,请转到循环后的语句。
  3. 执行正文后,执行第三部分(i++此处)
  4. 转到2.
  5. 第二部分(延续条件)每次都不能被完全评估是没有意义的。如果循环体中的某些内容导致getInt()在迭代之间返回不同的值,该怎么办?

    当然,编译器可以自由地执行常量表达式的优化以及它可以证明的其他一些事情。例如,如果getInt()被定义为:

    public int getInt() {
      return 4;
    }
    

    你的编译器可以

    1. 发出相当于for(int i = 0; i < 4; i++) { //body }
    2. 的代码
    3. 移除循环,然后通过必要的调整将循环体释放4次
    4. 不关心并发出未经优化的代码。
    5. 在某些情况下getInt()实际上会被调用,在其他情况下它不会被调用。在所有情况下,您的编译器都是正确的,因为它只会执行转换,导致代码的行为完全如同 - 如果不执行转换。