2013-06-20 7 views
5

Рассмотрим этот простой код:Почему эта причина бесконечный цикл

// E1 
    public void doTest(String pattern) { 
    int counter = 0; 

    while (counter < 3) { 
     counter = counter++; 
    } 
    System.out.println("Done"); 
} 

Это вызывает бесконечный цикл.

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

E2. counter = ++counter; 

или это

E3. counter++; 

Завершает нормально. Я понимаю, что приращение происходит после присваивания в версии, которая терпит неудачу, что объясняет, почему работает E2, но я думал, что java присваивает результаты приращения переменной, которая увеличивается, как в E3. Поэтому я недоумеваю, почему E1 терпит неудачу, но E3 этого не делает.

+0

Вы знаете, как использовать dubugger? Это отличный инструмент, который поможет вам понять, как работает этот код. –

+0

http://stackoverflow.com/questions/3831341/why-does-this-go-into-an-infinite-loop?rq=1 – fastcodejava

+0

Возможный дубликат [Есть ли разница между x ++ и ++ x в java? ] (HTTP: // StackOverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java) – nawfal

ответ

17
counter = counter++; 

Приведенный выше код не влияет на counter. Это так же, как эффективно:

int temp = counter; 
counter++; 
counter = temp; 

Таким образом, значение counter не меняется вообще.

С другой стороны, если вы используете:

counter = ++counter; 

Счетчик увеличивается, а затем повторно назначен на счетчик. По сути, вы можете просто игнорировать часть присваивания, и держать его просто:

counter++; // Or ++counter 
+0

вы забыли точку с запятой после 'counter ++' в 2-м блоке кода – Shaddow

+0

@Elliott, вы можете это понимать, читая на пост и префиксы здесь: http://en.wikipedia.org/wiki/Increment_and_decrement_operators –

2

Проблема заключается в том, что значение counter в конце тела цикла так же, как это было в самом начале. Заявление counter = counter++ эквивалентно:

int temp = counter; 
counter = counter + 1; 
counter = temp; 

Оператор postIncrement++ возвращает значение до приращения; оператор ++preIncrement возвращает добавочное значение.

1

Заменить

counter = counter++; 

по: 1)

counter+=1; 

или

2)

counter++; 

Ура!

0

Лучше избегать такого рода назначения. ++ предназначен для использования сам по себе. Если вы хотите увеличить его, вы могли бы сделать counter += 1.