Я пытаюсь понять, почему этот цикл завершается ...Булево сравнение ints, когда RHS == Integer.MAX_VALUE, почему этот цикл завершается?
@Test
public void test() {
int counter=0;
int from = 0;
int until = Integer.MAX_VALUE;
while(counter <= until) {
counter++;
if(counter < from) {
System.out.println("continuing " + counter + " <= " + from);
continue;
}
}
System.out.println("finished " + counter);
}
while(counter <= until)
всегда следует принять решение true
, так как счетчик не может быть увеличен за Integer.MAX_VALUE. Таким образом, цикл не должен заканчиваться.
Однако в Eclipse, если я бегу с JUnit бегуна я получаю:
finished 108772
Если я бегу в отладчике я получаю:
finished 125156
Выход в if(counter < from)
никогда не выход , Если я удалю этот блок, код все равно завершится, на этот раз в Integer.MAX_VALUE.
finished 2147483647
Я бы не ожидал, что это закончится. 'Int' всегда' <= Integer.MAX_VALUE'. –
Он заканчивается символом 'int до = Integer.MAX_VALUE-1;' –
Это очень странно. Для меня это дает непоследовательные значения около 300000 в большинстве случаев. Я думаю, что это должна быть какая-то оптимизация компилятора, потому что она, конечно же, не должна заканчиваться. Заглядывая в нее сейчас ... – gandaliter