2015-09-26 5 views
1

Если у меня есть цикл, как так:Являются ли функции внутри оператора условия цикла, выполняемого каждый раз?

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

будет GetInt() будет выполняться каждый раз, когда для проверки цикла, если:

i < getInt(); 

или будет выполняться один раз в самом начале и возвращает значение J, так что цикл может просто проверить, если:

i < j; 

специфический язык, который я задаюсь вопросом о том, Java, но если ответ отличается в других л я тоже хотел бы знать это.

+1

Если вы беспокоитесь об оптимизации, это, вероятно, не изменит ситуацию. По крайней мере, если компилятор может доказать подъем, вызов функции эквивалентен, тогда он свободен. – chris

+0

Java, C# и C/C++ имеют одинаковое поведение - условие оценивается каждую итерацию, но это может быть оптимизировано, если компилятор может определить, что значение не будет изменяться в цикле. VB отличается - цикл «For» только один раз оценивает конечное условие. –

ответ

6

Да, он будет выполняться каждый цикл.

В принципе, исполнение выглядит следующим образом:

  1. Первая часть условия for выполняется один раз
  2. Вторая часть оценивается, если это true тело цикла выполняется. В противном случае перейдите к следующему циклу.
  3. После того как тело выполняется, третья часть (i++ здесь) выполняется
  4. Перейти к 2.

Было бы действительно никакого смысла во второй части (условие продолжения) не в полной мере оценены каждый раз. Что, если что-то в теле вашего цикла вызывает getInt(), чтобы вернуть другое значение между итерациями?

Конечно, компилятор может выполнять оптимизацию вокруг постоянных выражений и некоторые другие вещи, которые он может доказать. Например, если getInt() был определен как например:

public int getInt() { 
    return 4; 
} 

Ваш компилятор может

  1. Испустите код эквивалентен for(int i = 0; i < 4; i++) { //body }
  2. Удалить петлю и просто испускать тело цикла 4 раза необходимым корректировки
  3. Не заботьтесь и не испускайте не оптимизированный код.

В некоторых случаях getInt() на самом деле будет называться, в других случаях это не так. Во всех случаях ваш компилятор будет прав, потому что он будет выполнять только преобразования, которые приводят к коду, который ведет себя точно так, как если бы преобразования не выполнялись.

Смежные вопросы