[英]Why incrementing int primitive in while loop does not loop forever
我有以下代碼示例
int i = 1;
while(i != 0) {
i++;
}
我期待這個在無限循環中運行,但事實並非如此。 然后,當我在while循環后打印值時,我得到了:
i value is 0.
誰能告訴我究竟發生了什么?
我期待這個在無限循環中運行,但事實並非如此。
不,它不會。 最終該值將再次變為0。
特別是,它將在邏輯上執行如下:
1
2
3
...
2,147,483,646
2,147,483,647
-2,147,483,648 // Integer overflow => wrapping
-2,147,483,647
...
-3
-2
-1
0
...然后循環結束
從JLS第15.18.2節 :
如果整數加法溢出,則結果是數學和的低階位,如某些足夠大的二進制補碼格式所示。 如果發生溢出,則結果的符號與兩個操作數值的數學和的符號不同。
此代碼沒有內存問題,因為它不執行任何分配 - 它只是增加一個局部變量,完全在堆棧上。
現在它是否真的這樣做是另一回事 - 如果JIT能夠在不執行每次迭代的情況下計算出行為將會是什么,它可以優化它 - 但這是一個實現細節。 重要的是要理解行為背后的邏輯。
int
是int
:對於每個i
,如果i
是int
那么i+1
。 int
總是32位,它永遠不需要更大的容器。
最后,你的循環不是無限的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.