2013-04-03 2 views
4

Я пытаюсь понять, почему этот цикл завершается ...Булево сравнение 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 
+7

Я бы не ожидал, что это закончится. 'Int' всегда' <= Integer.MAX_VALUE'. –

+0

Он заканчивается символом 'int до = Integer.MAX_VALUE-1;' –

+0

Это очень странно. Для меня это дает непоследовательные значения около 300000 в большинстве случаев. Я думаю, что это должна быть какая-то оптимизация компилятора, потому что она, конечно же, не должна заканчиваться. Заглядывая в нее сейчас ... – gandaliter

ответ

0

не совсем уверен, что вы пытаетесь сделать здесь ваш цикл в то время как будет работать, как ожидалось, но от никогда не изменится так что «счетчик меньше, чем от» привычка никогда не будет выполнена?

до (макс целое) не будет = 2147483647

если изменить время цикла для (счетчик < до) вы получите выходной текст «закончил 2147483647»

что поможет?

+0

Да, этот блок никогда не выполняется, но странное удаление его изменяет поведение (см. Обновленный вопрос выше). Блок * * заканчивается. –

0

Я не могу воспроизвести ваш выход, поэтому это не ответ, просто наблюдение. Рассмотрим только эти строки.

int counter=0; 
int until = Integer.MAX_VALUE; 
while(counter <= until) { 
    counter++; 

Условие while равно или равно EQUAL. Поэтому, когда счетчик равен Integer.MAX_VALUE, к нему добавляется один. Это дает наибольшее возможное отрицательное число Java. Продолжайте добавлять одно к этому значению, и оно в конечном итоге станет нулевым, а затем подсчитайте еще раз, пока не достигнет Integer.MAX_VALUE. Затем вся последовательность начинается снова. Для меня это выглядит бесконечно.

Вы также выполняете строку «Продолжение» на каждой итерации при подсчете от наибольшего отрицательного числа.

+0

Согласен - вы, вероятно, опубликовали только до/после того, как я отредактировал вопрос, чтобы спросить конкретно «почему это заканчивается?». –

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