Да, он будет выполняться каждый цикл.
В принципе, исполнение выглядит следующим образом:
- Первая часть условия
for
выполняется один раз
- Вторая часть оценивается, если это
true
тело цикла выполняется. В противном случае перейдите к следующему циклу.
- После того как тело выполняется, третья часть (
i++
здесь) выполняется
- Перейти к
2.
Было бы действительно никакого смысла во второй части (условие продолжения) не в полной мере оценены каждый раз. Что, если что-то в теле вашего цикла вызывает getInt()
, чтобы вернуть другое значение между итерациями?
Конечно, компилятор может выполнять оптимизацию вокруг постоянных выражений и некоторые другие вещи, которые он может доказать. Например, если getInt()
был определен как например:
public int getInt() {
return 4;
}
Ваш компилятор может
- Испустите код эквивалентен
for(int i = 0; i < 4; i++) { //body }
- Удалить петлю и просто испускать тело цикла 4 раза необходимым корректировки
- Не заботьтесь и не испускайте не оптимизированный код.
В некоторых случаях getInt()
на самом деле будет называться, в других случаях это не так. Во всех случаях ваш компилятор будет прав, потому что он будет выполнять только преобразования, которые приводят к коду, который ведет себя точно так, как если бы преобразования не выполнялись.
Если вы беспокоитесь об оптимизации, это, вероятно, не изменит ситуацию. По крайней мере, если компилятор может доказать подъем, вызов функции эквивалентен, тогда он свободен. – chris
Java, C# и C/C++ имеют одинаковое поведение - условие оценивается каждую итерацию, но это может быть оптимизировано, если компилятор может определить, что значение не будет изменяться в цикле. VB отличается - цикл «For» только один раз оценивает конечное условие. –