在介紹之前引入一個問題:爲什麼要寫循環語句?在此我們先來看一個常見問題:
爲此,爲了不重複輸入大量的冗餘代碼,我們需要用到循環語句,來幫我們簡化代碼的結構。
循環是用來控制語句塊重複執行的一種結構。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循環。
目前循環的語句已經介紹完畢,還有一些細節問題和解題思路會在後續講解中慢慢引入。