2014-01-22 62 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會是假的,while循環將終止......

但不,這不會發生。

那麼可能是無限循環的原因是什麼?

+2

聽起來像一個調試器的優秀問題。穿過它。或者把一些日誌語句放在那裏。 – nhgrif

+0

'x = x ++;'留下''x'不變 - 您增加它,然後用OLD值(增加前的值)替換它。 –

+0

-1沒有檢出「相關」(第二個問題包含答案) – sashkello

回答

7

表達x++是後遞增的,這意味着它的表達式的值是舊值,0,然後將其分配回x,所以x總是0x = x++;之後。

爲了擺脫無限循環的,不分配回x,留下的x1增量後的值,完整:

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

這就是因爲使用後x增加了。因此,發生業務的擴展順序是:

  1. oldX = x
  2. x++,就是x = x + 1
  3. x = oldX

oldX是虛構的變量。

會發生什麼是x總是分配oldX,在我們的案例中是0,導致無限循環。 x++部分被忽略。

解決方法:更換x = x++x++或者,如果你真的x = ++x

相關問題