- 好好學(xué)Java:從零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)
- 歐陽(yáng)燊
- 443字
- 2022-07-27 19:14:57
3.2.4 for循環(huán)
前面介紹while循環(huán)時(shí),有一個(gè)名叫year的整型變量頻繁出現(xiàn),它是控制循環(huán)進(jìn)出的關(guān)鍵要素。無(wú)論哪一種while寫(xiě)法,都存在3處與year有關(guān)的操作,分別是“year=0”“year<limit”“year++”。第一個(gè)“year=0”用來(lái)給該變量賦初始值,第二個(gè)“year<limit”則為是否退出循環(huán)的判斷條件,第三個(gè)“year++”用于該變量的自增操作。這3處語(yǔ)句結(jié)合起來(lái)才能實(shí)現(xiàn)循環(huán)的有限次數(shù)處理,而非無(wú)限次數(shù)的運(yùn)轉(zhuǎn)。換句話說(shuō),要想實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的循環(huán)結(jié)構(gòu),就必須具備上述的3種基本操作。于是Java設(shè)計(jì)了新的for循環(huán),意圖讓形態(tài)規(guī)整的for語(yǔ)句取代結(jié)構(gòu)散亂的while語(yǔ)句。
for循環(huán)的書(shū)寫(xiě)格式形如“for (式子A;式子B;式子C;) { /*這里是循環(huán)的內(nèi)部代碼*/ }”。其中,式子A是初始化語(yǔ)句,在首次進(jìn)入循環(huán)時(shí)執(zhí)行;式子B是循環(huán)的判斷條件,當(dāng)B成立時(shí)繼續(xù)循環(huán),當(dāng)B不成立時(shí)退出循環(huán);式子C一般是變量的自增或自減操作,在開(kāi)始下一次循環(huán)之前執(zhí)行。仍以前述的喚醒游戲?yàn)槔褂胒or語(yǔ)句改寫(xiě)后的循環(huán)代碼如下(完整代碼見(jiàn)本章源碼的src\com\control\process\ForLoop.java):
System.out.println("長(zhǎng)夜漫漫,無(wú)心睡眠,請(qǐng)給他設(shè)定一個(gè)睡醒的年限"); Scanner scan=new Scanner(System.in); // 從控制臺(tái)接收輸入文本 int limit=scan.nextInt(); // nextInt方法表示接收一個(gè)整數(shù),以回車(chē)鍵結(jié)尾 int year; // for (式子A; 式子B; 式子C;)的三個(gè)式子A、B、C說(shuō)明如下 // 式子A在首次進(jìn)入循環(huán)時(shí)執(zhí)行 // 式子B是循環(huán)的判斷條件,B成立時(shí)繼續(xù)循環(huán),不成立時(shí)退出循環(huán) // 式子C在開(kāi)始下一次循環(huán)之前執(zhí)行 // 注意,每次循環(huán)結(jié)束之后,先執(zhí)行式子C,再判斷式子B for (year=0; year<limit; year++) { System.out.println("已經(jīng)過(guò)去的年份:"+year); } System.out.println("他足足睡了這么多年:"+year);
從以上代碼可見(jiàn),for循環(huán)把3種基本操作放到了同一行,大大縮減了代碼行數(shù)。僅僅3行for語(yǔ)句,等價(jià)于以下十幾行的while循環(huán)代碼:
year=0; if (year<limit) { while (true) { // 開(kāi)始循環(huán)處理 System.out.println("已經(jīng)過(guò)去的年份:"+year); year++; if (year<limit) { // 年份未達(dá)到條件,繼續(xù)循環(huán) continue; } else { // 年份已達(dá)到條件,退出循環(huán) break; } } }
不過(guò)精簡(jiǎn)代碼的代價(jià)是缺乏靈活性。for語(yǔ)句的條件判斷默認(rèn)在每次循環(huán)開(kāi)始之前執(zhí)行,倘若希望在循環(huán)內(nèi)部的指定位置判斷是否繼續(xù)循環(huán),仍然要把式子B的判斷條件挪到循環(huán)里面,此時(shí)for語(yǔ)句原先給式子B的地方可以留空。于是挪動(dòng)條件判斷之后的for循環(huán)代碼變成了下面這樣(完整代碼見(jiàn)本章源碼的src\com\control\process\ForLoop2.java):
for (int year=0; ; year++) { System.out.println("已經(jīng)過(guò)去的年份:"+year); if (year >= limit) { // 這里判斷能否跳出循環(huán) System.out.println("他足足睡了這么多年:"+year); break; // 跳出循環(huán),即跳到for循環(huán)的右花括號(hào)之后 } else { continue; // 繼續(xù)下一次循環(huán)。此時(shí)先執(zhí)行year++,再執(zhí)行循環(huán)內(nèi)部語(yǔ)句 } }
既然式子B原來(lái)的位置允許留空,那么只要處理得當(dāng),式子A和式子C的位置也是允許留空的。3個(gè)位置同時(shí)留空后的for循環(huán)代碼示例如下(完整代碼見(jiàn)本章源碼的src\com\control\process\ ForLoop3.java):
int year=0; // 把式子A挪到整個(gè)循環(huán)的前面 for (; ; ) { // for語(yǔ)句后面的3個(gè)位置全部留空 System.out.println("已經(jīng)過(guò)去的年份:"+year); if (year >= limit) { // 這里判斷能否跳出循環(huán) System.out.println("他足足睡了這么多年:"+year); break; // 跳出循環(huán),即跳到for循環(huán)的右花括號(hào)之后 } else { year++; // 把式子C挪到continue之前 continue; // 繼續(xù)下一次循環(huán)。此時(shí)先執(zhí)行year++,再執(zhí)行循環(huán)內(nèi)部語(yǔ)句 } }
可是一旦緊跟for語(yǔ)句之后的3個(gè)位置全部留空,這個(gè)for就變得毫無(wú)特點(diǎn)了,此時(shí)的“for (; ; )”完全等價(jià)于“while (true)”。所以說(shuō),具體采取哪種循環(huán)形式,還得根據(jù)實(shí)際的業(yè)務(wù)要求來(lái)定奪。
- Learn ECMAScript(Second Edition)
- ClickHouse性能之巔:從架構(gòu)設(shè)計(jì)解讀性能之謎
- Java范例大全
- Java Web及其框架技術(shù)
- Essential Angular
- Web Application Development with MEAN
- 高級(jí)C/C++編譯技術(shù)(典藏版)
- Java設(shè)計(jì)模式及實(shí)踐
- FFmpeg入門(mén)詳解:音視頻原理及應(yīng)用
- ASP.NET程序設(shè)計(jì)教程
- OpenStack Orchestration
- Learning ArcGIS for Desktop
- Spring MVC+MyBatis開(kāi)發(fā)從入門(mén)到項(xiàng)目實(shí)踐(超值版)
- C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)教程與水平考試指導(dǎo)
- SQL Server 入門(mén)很輕松(微課超值版)