2014-01-22 3 views
0

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

public class Game { 

    public static void main(String[] args) { 

     int x = 0; 
     while (x < 1) { 
      x = x++; 
     } 

    } 

} 

С моим компилятором этот код входит в бесконечный цикл, но почему?

Во-первых, мы помещаем значение x в x и только тогда мы добавляем 1 к x, и после этого я бы ожидать, что 1 < 1 будет ложным, и цикл в то время как было бы прекратить ...

Но нет, этого не происходит.

Так что же может быть причиной бесконечного цикла?

+2

Звучит как отличный вопрос для отладчика. Пройдите через него. Или поставьте там некоторые записи журнала. – nhgrif

+0

'x = x ++;' оставляет 'x' неизменным - вы увеличиваете его, а THEN заменяете его значением OLD (значение перед тем, как вы увеличиваете). –

+0

-1 для того, чтобы не проверять «Связанный» (второй вопрос содержит ответ) – sashkello

ответ

7

Выражение x++ является пост-инкремент, а это означает, что оно значение выражения есть старое значение, 0, который затем присваивается обратно x, так x всегда 0 после x = x++;.

Чтобы вырваться из бесконечного цикла, не назначайте его обратно x, в результате чего значение после приращения x, 1, нетронутым:

while (x < 1) { 
    x++; 
} 
0

x = x++ не делать то, что вы хотите. Замените его на x++.

x++ эквивалентен x = x + 1, поэтому ваше назначение не имеет смысла.

Более подробную информацию об этом можно найти в ответах здесь:

Why does this go into an infinite loop?

+0

Я имел в виду именно это: 'x = x ++;' – ron

+1

@ron это то же самое, что и t = x + 1; x = x; – user3125280

+0

Нет, @ron, вы имеете в виду 'x = x + 1;', однако вы решили написать его. –

1

x++ является в значительной степени эквивалентно

some-temporary = x; 
x = x + 1; 
now use the value of some-temporary 

Так x = x++; эквивалентно

some-temporary = x; 
x = x + 1; 
x = some-temporary; 

так вам следует уметь видеть, почему добавленная часть 1 не имеет никакого эффекта.

1

Это beacause x получает приращение после использования. Таким образом, расширенная последовательность операций, осуществляемых бы:

  1. oldX = x
  2. x++, то есть x = x + 1
  3. x = oldX

oldX является фиктивной переменной.

Случается, что x всегда присваивается oldX, что в нашем случае равно 0, что приводит к бесконечному циклу. Часть x++ просто игнорируется.

Решение: заменить x = x++ с x++ или, если вы действительно хотите, x = ++x.

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