前面介紹while循環時,有個名叫year的整型變量頻繁出現,而且它是控制循環進出的關鍵要素。無論哪種while寫法,都存在三處與year有關的操做,分別是「year = 0」、「year<limit」、「year++」。第一個「year = 0」用來給該變量初始賦值,第二個「year<limit」則爲是否退出循環的判斷條件,第三個「year++」用於該變量的自增操做。這三處語句結合起來,方能實現循環的有限次數處理,而非無限次的運轉。換句話說,要想實現一個標準的循環結構,就必須具有上述的三種基本操做。因而Java設計了新的for循環,意圖讓形態規整的for語句取代結構散亂的while語句。
for循環的書寫格式形如「for (A; B; C;) { /* 這裏是循環的內部代碼 */ }」,其中式子A是初始化語句,在首次進入循環時執行;式子B是循環的判斷條件,B成立時繼續循環,不成立時退出循環;式子C通常是變量的自增或自減操做,在開始下一次循環以前執行。仍之前述的喚醒遊戲爲例,使用for語句改寫後的循環代碼以下所示:java
System.out.println("長夜漫漫,無意睡眠"); System.out.println("請給他設定一個睡醒的年限"); Scanner scan = new Scanner(System.in); // 從控制檯接收輸入文本 /* nextLine方法表示接收一行文字,以回車鍵結尾 */ int limit = scan.nextInt(); int year; // for (A; B; C;)的三個式子A、B、C說明以下: // 式子A在首次進入循環時執行; // 式子B是循環的判斷條件,B成立時繼續循環,不成立時退出循環; // 式子C在開始下一次循環以前執行。注意,每次循環結束以後,先執行式子C,再進行式子B的判斷 for (year=0; year<limit; year++) { System.out.println("已通過去的年份:"+year); } System.out.println("他足足睡了這麼多年:"+year);
從以上代碼可見,for循環把三種基本操做都放到了同一行,大大縮減了代碼行數。僅僅三行for語句,等價於如下十幾行的while循環代碼:設計
year = 0; if (year<limit) { while (true) { System.out.println("已通過去的年份:"+year); year++; if (year<limit) { continue; } else { break; } } }
不過精簡代碼的代價是缺少靈活性,因爲for語句的條件判斷默認在每次循環開始以前執行,假若但願在循環內部的指定位置進行是否繼續循環的判斷,則仍然要把式子B的判斷條件挪到循環裏面,此時for語句原先給式子B的地方能夠留空。因而挪動條件判斷以後的for循環代碼變成了下面這樣:blog
for (int year=0; ; year++) { System.out.println("已通過去的年份:"+year); if (year >= limit) { // 這裏判斷可否跳出循環 System.out.println("他足足睡了這麼多年:"+year); break; // 跳出循環。即跳到for循環的右花括號以後 } else { continue; // 繼續下一次循環。此時先執行year++,再執行循環內部語句 } }
既然式子B原來的位置容許留空,那麼只要處理得當,式子A和式子C的位置也是容許留空的。三個位置同時留空後的for循環代碼示例以下:遊戲
int year = 0; // 把式子A挪到整個循環的前面 for (; ; ) { // for語句後面的三個位置所有留空 System.out.println("已通過去的年份:"+year); if (year >= limit) { // 這裏判斷可否跳出循環 System.out.println("他足足睡了這麼多年:"+year); break; // 跳出循環。即跳到for循環的右花括號以後 } else { year++; // 把式子C挪到continue以前 continue; // 繼續下一次循環。此時先執行year++,再執行循環內部語句 } }
但是一旦緊跟for語句以後的三個位置全都留空,這個for就變得毫無特色了,此時的「for (; ; )」徹底等價於「while (true)」。因此說,具體採起哪一種循環形式,還得根據實際的業務要求來定奪。it