【java解惑】整型溢出的循環控制變量


    如下代碼:

public class Example026 {

	public static final int END = Integer.MAX_VALUE;
	public static final int START = END - 100;

	public static void main(String[] args) {
		int count = 0;
		for (int i = START; i <= END; i++) {
			count++;
			System.out.println(count);
		}
		System.out.println(count);
	}
}


    輸出說明:

    循環打印整型所能表示範圍內的所有數字且程序無法正確退出


    代碼分析:

    上述代碼中循環控制變量i的起始值爲int的最大值減去100,終止條件爲小於等於int的最大值。循環開始運行後,當i的值等於END時,i++,這時i的值超過了int的表示範圍,導致溢出,i的值變爲整型的最小值。當再次將i與END進行判斷時,循環條件成立,繼續運行。每次當循環條件的值等於整型最大值時就會加1溢出,重新運行。所以上述程序的最終結果就是無法正確退出。

    對於上述代碼的一種改進策略是將循環控制條件的類型由int改爲long。這樣,在i的值等於整型最大值時,加1不會溢出,循環就能正常終止了。

    當然也可以將代碼改換一種寫法(保證循環能夠執行101次而不是100次),如下所示:

int count = 0;
int i = START;
do {
   count++;
} while (i != END);


(注:本【java解惑】系列,均是博主閱讀《java解惑》原書後,將原書上的講解和例子部分改編,然後寫成博文進行發佈的。所有例子均親自測試通過,並共享在github上。通過這些例子,激勵自己,惠及他人。同時,本系列所有博文會同步發佈在博主個人微信公衆號(搜索“愛題猿”或者“ape_it”),方便大家閱讀。如果文中有任何侵犯原作者權利的內容,請及時告知博主,以便及時刪除;如果讀者對文中的內容有異議或者問題,歡迎通過博客留言或者微信公衆號留言等方式共同探討。)

源代碼地址:https://github.com/rocwinger/java-disabuse


本文出自 “winger” 博客,謝絕轉載!

發佈了48 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章