在介紹之前引入一個問題:為什麼要寫循環語句?在此我們先來看一個常見問題:
為此,為了不重複輸入大量的備援代碼,我們需要用到循環語句,來幫我們簡化代碼的結構。
循環是用來控制語句塊重複執行的一種結構。Java語言中有三種主要的循環結構語句,即:for循環、while循環、do…while循環,現在對其一 一介紹
for循環
-
首先是for循環的文法結構:
for(1.初始化;2.循環繼續的條件;4.每疊代一次後的操作){
3.循環體
}
for循環結構的寫法并不是固定的,如可以寫成:
1.初始化
for(2.循環繼續的條件){
3.循環體
4.每疊代一次後的操作
}
等形式,但是為了代碼規範,需要統一。
其執行流程為:1.初始化 —> 2.循環機組繼續的條件 —> 3.循環體 —> 4.每疊代後的操作
如果還不了解的話,可以參考一下流程圖:
for 循環隻執行初始動作一次,當循環繼續條件為真時,重複執行循環體中的語句,然後完成每次疊代後的操作
-
現在我們來分析上面的例題:
要列印100行"Welcome to java!",首先是從第一行開始列印的,即初始化條件為定義一個變量為1,姑且定義一個i變量吧,則 int i = 1;此時分析循環什麼時候結束呢?即當列印到第100行的時候,是以 i <=100,此時執行我們的循環體 即我們要列印的内容System.out.println(“Welcome to java!”),最後就是疊代後的操作,i相當于一個計數器,對列印的行數記載,每列印一行就要計數一行,是以 i++。
綜上所述,我們的程式應為
public class Demon01{
public static void mian(String[] args){
for(int i=1;i<=100;i++){
System.out.println("Welcome to java!")
}
}
}
//注:此程式很簡單,隻是用來引入for循環的結構
控制變量必須在循環控制結構體内或循環前說明。如果循環控制變量隻在循環内使用而不在其他地方使用,那麼在 for 循環的初始動作中聲明它是一個很好的程式設計習慣。如果在循環控制結構體内聲明變量,那麼在循環外不能引用它。例如,不能在前面代碼的for 循環外引用變量 i, 因為它是在 for 循環内聲明的。
while循環
-
讓我們再來看一下while循環的文法結構:
while( 循環繼續的條件){
// 循環體
}
while循環沒有其他書寫的格式。
while循環相對for循環來說文法結構較為簡單,且循環繼續條件是一個布爾表達式,控制循環體的執行。在循環體執行前總是先計算循環條件以決定是否執行它。若條件為 true, 則執行循環體;若條件為 false,則終止整個循環,并且程式控制轉移到 while 循環後的下一條語句,下面給出while循環的控制流程圖:
while循環的繼續條件是一個布爾表達式,控制循環體的執行。在循環體執行前總是先計算循環條件以決定是否執行它。若條件為 true, 則執行循環體;若條件為 false,則終止整個循環,并且程式控制轉移到 while 循環後的下一條語句 -
現在讓我們用while循環的語句結構來分析上面的問題:
在循環開始之前我們要先初始化,即控制列印行數的變量從第一行開始,int i=1;然後判斷循環的條件i小于等于100,直到列印100行之後就結束了,循環體執行的是列印的内容System.out.println(“Welcome to java!”),每列印完變量i加一,綜上所述,while循環的代碼為:
public class Demon02{
public static void mian(String[] args){
int i= 1;
while(i<=100){
System.out.println("Welcome to java!");
i++;
}
}
}
do…while()
do…while 循環和 while 循環基本一樣,不同的是它先執行循環體一次,然後判
斷循環繼續條件。do…while 循環是 while 循環的變體。它的文法如下:
do {
// 循環體 ;
語句(組 );
} while ( 循環繼續條件);
是以上面的問題用do…while()文法結構實作為:
public class Demon03{
public static void mian(String[] args){
int i =1;
do{
System.out.println("Welcome to java!");
i++;
}while(i<100)
}
}
程式員經常會犯的錯誤就是使循環多執行一次或少執行一次。這種情況通常稱為差一錯誤( off by one error)。例如:上面的循環可能會将 Welcome to ]ava 顯示 101次,而不是100 次。這個錯誤出在條件部分,是以條件應該是 i<100 而不是 i<=100。
while 循環與 do…while 循環的差别在于:計算循環繼續條件和執行循環體的先後順序不同。有時候,選擇其中一種會比另一種更友善,可以在後續講解題中慢慢的了解。
要保證循環繼續條件最終可以變為 false,以便程式能夠結束。一個常見的程式設計錯誤是無限循環(也就是說,循環會永遠執行下去)。如果程式運作了不尋常的長時間而不結束,可能其中有無限循環。如果你是從指令視窗運作程式的,按 CTRL+C 鍵來結束。
無限循環
無限循環的原因是沒有判斷循環繼續的條件或是永遠沒有達到循環結束的條件,死循環的文法結構是for( ;;){ }和while(true){ },兩者都是無條件先進入死循環,在循環體中判斷循環結束的條件,死循環并不是不好的,有時候沒有給出初始化條件或不知道要循環幾次,隻能根據循環體中的執行結果才能判斷目前是否跳出循環,此時就必須先進入死循環。上面的問題也可以用先進入死循環的方法進行列印。如:
public class Demon4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i =1;
for(;;){ //進入死循環
System.out.println("Welcome to java!");
i++;
if(i>100) { //當列印到的行數超過100行時
break; //跳出死循環
}
}
}
}
關鍵字break和continue
在上面無限循環的代碼中,判斷列印的行數到100行以上以後,就跳出了循環,其中用到了一個“break”關鍵字,其實還有一個控制循環的關鍵字為“continue”,顧名思義,break是打破的意思,即打破循環使循環終止,但終止的是目前break所在的循環,并不能結束程式中所有的循環,而且不管循環是否運作完,都會強行跳出;相反continue是繼續的意思,當程式遇到這個關鍵字時,會繼續執行目前循環,直到目前的循環自行結束或者遇到brake,才會停止。
關鍵字 break 和 continue 都可以在循環語句中使用,為循環提供額外的控制。在某些情況下,使用 break 和 continue 可以簡化程式設計。但是,過度使用或者不正确地使用它們會使得程式難以讀懂也難以調試。下面我們來看一個代碼示例:
continue 語句總是在一個循環内。在 while 和 do…while 循環中,continue 語句之
後會馬上計算循環繼續條件;而在 for 循環中,continue 語句之後會立即先執行每次疊代
後的動作,再計算循環繼續條件。
小結
循環設計政策
編寫一個正确的循環對程式設計新手來說,并不是件容易的事。編寫循環時應該考慮如下三
個步驟:
- 第一步:确定需要重複的語句。
-
第二步:将這些語句放在一個循環中,如下所示:
while(true){
語句組 ;
}
-
第三步:為循環繼續條件編碼,并為控制循環添加适合的語句。
while( 循環繼續條件){
語句組 ;
用于控制循環的附件語句 ;
}
在選擇用哪個循環時,可以根據哪個更加友善,來使用 for 循環、while 循環,或者 do…while 循環,這是根據解決問題的要求而來的。
while 循環和 for 循環都稱為前測循環( pretest loop), 因為繼續條件是在循環體執行之前檢測的,do…while 循環稱為後測循環( posttest loop), 因為循環條件是在循環體執行之後檢測的。三種形式的循環語句:while、do…while 和 for, 在表達上是等價的。也就是說,可以使用這三種形式之一來編寫一個循環。一般情況下while 循環與for 循環之間可以互相轉化。
建議使用自己覺得最自然、最舒服的一種循環語句。通常,如果已經提前知道重複次數,那就采用 for 循環,例如,需要列印一條資訊 100 次時,如果無法确定重複次數,就采用 while 循環,就像讀入一些數值直到讀入 0 為止的這種情況。如果在檢驗繼續條件前需要執行循環體,就用 do…while 循環替代while循環。
目前循環的語句已經介紹完畢,還有一些細節問題和解題思路會在後續講解中慢慢引入。