標籤:情況 內容 一個 流程圖 i++ 沒有初始化 .com 下標 lock
《Java從小白到大牛》紙質版已經上架了!!!
程式設計中的控制語句有三種,即順序、分支和迴圈語句。Java程式通過控制語句來管理程式流,完成一定的任務。程式流是由若干個語句組成的,語句可以是一條單一的語句,也可以是一個用大括弧({})括起來的複合陳述式。Java中的控制語句有以下幾類:
- 分支語句:if和switch。
- 迴圈語句:while、do-while和for
- 跳躍陳述式:break、continue、return和throw
7.1 分支語句
分支語句提供了一種控制機制,使得程式具有了“判斷能力”,能夠像人類的大腦一樣分析問題。分支語句又稱條件陳述式,條件陳述式使部分程式可根據某些運算式的值被有選擇地執行。Java程式設計語言提供了if和switch兩種分支語句。
7.1.1 if語句
由if語句引導的選擇結構有if結構、if-else結構和else-if結構三種。
#####1. if結構
如果條件運算式為true就執行語句組,否則就執行if結構後面的語句。如果語句組只有一條語句,可以省略大括弧,當從編程規範角度不要省略大括弧,省略大括弧會是程式的可讀性變差。文法結構如下:
if (條件運算式) { 語句組}
if結構範例程式碼如下:
int score = 95;if (score >= 85) { System.out.println("您真優秀!");}if (score < 60) { System.out.println("您需要加倍努力!");}if ((score >= 60) && (score < 85)) { System.out.println("您的成績還可以,仍需繼續努力!");}
程式運行結果如下:
您真優秀!
#####2. if-else結構
所有的語言都有這個結構,而且結構的格式基本相同,語句如下:
if (條件運算式) { 語句組1 } else { 語句組2 }
當程式執行到if語句時,先判斷條件運算式,如果值為true,則執行語句組1,然後跳過else語句及語句組2,繼續執行後面的語句。如果條件運算式的值為false,則忽略語句組1而直接執行語句組2,然後繼續執行後面的語句。
if-else結構範例程式碼如下:
int score = 95;if (score < 60) { System.out.println("不及格");} else { System.out.println("及格");}
程式運行結果如下:
及格
#####3. else-if結構
else-if結構如下:
if (條件運算式1) { 語句組1 } else if (條件運算式2) { 語句組2} else if (條件運算式3) { 語句組3 ... } else if (條件運算式n) { 語句組n} else { 語句組n+1}
可以看出,else-if結構實際上是if-else結構的多層嵌套,它明顯的特點就是在多個分支中只執行一個語句組,而其他分支都不執行,所以這種結構可以用於有多種判斷結果的分支中。
else-if結構範例程式碼如下:
int testScore = 76;char grade;if (testScore >= 90) { grade = ‘A‘;} else if (testScore >= 80) { grade = ‘B‘;} else if (testScore >= 70) { grade = ‘C‘;} else if (testScore >= 60) { grade = ‘D‘;} else { grade = ‘F‘;}System.out.println("Grade = " + grade);
輸出結果如下:
Grade = C
其中char grade是聲明字元變數,然後經過判斷最後結果是C。
7.1.2 switch語句
switch提供多分支程式結構語句。下面先介紹一下switch語句基本形式的文法結構,如下所示:
switch (運算式) { case 值1: 語句組1 case 值2: 語句組2 case 值3: 語句組3 ... case 判斷值n: 語句組n default: 語句組n+1 }
switch語句中“運算式”計算結果只能是int、byte、short和char類型,不能是long更不能其他的類型。每個case後面只能跟一個int、byte、short和char類型的常量,default語句可以省略。
當程式執行到switch語句時,先計算條件運算式的值,假設值為A,然後拿A與第1個case語句中的值1進行匹配,如果匹配則執行語句組1,語句組執行完成後不跳出switch,只有遇到break才跳出switch。如果A沒有與第1個case語句匹配,則與第2個case語句進行匹配,如果匹配則執行語句組2,以此類推,直到執行語句組n。如果所有的case語句都沒有執行,就執行default的語句組n+1,這時才跳出switch。
範例程式碼如下:
int testScore = 75;char grade;switch (testScore / 10) { ①case 9: grade = ‘優‘; break;case 8: grade = ‘良‘; break;case 7: // 7是貫通的 ②case 6: grade = ‘中‘; break;default: grade = ‘差‘;}System.out.println("Grade = " + grade);
輸出結果如下:
Grade = 中
上述代碼將100分制轉換為:“優”、“良”、“中”、“差”評分制,其中7分和6分都是“中”成績,把case 7和case 6當成一種情況考慮。代碼第①行計算運算式獲得0~9分數值。代碼第②行的case 7是貫通的,就它的後面不加break,程式流執行完當前case後,則會進入到下一個case,因此本來中case 7和case 6都執行相同的代碼。
7.2 迴圈語句
迴圈語句能夠使程式碼重複執行。Java支援三種迴圈構造類型:while、do-while、和for。for和while迴圈是在執行迴圈體之前測試迴圈條件,而do-while是在執行迴圈體之後測試迴圈條件。這就意味著for和while迴圈可能連一次迴圈體都未執行,而do-while將至少執行一次迴圈體。另外Java 5之後推出for-each迴圈語句,for-each迴圈是for迴圈的變形,它是專門為集合遍曆而設計的,注意for-each並不是一個關鍵字。
7.2.1 while語句
while語句是一種先判斷的迴圈結構,格式如下:
while (迴圈條件) { 語句組}
while迴圈沒有初始化語句,迴圈次數是不可知的,只要迴圈條件滿足,迴圈就會一直進行下去。
下面看一個簡單的樣本,代碼如下:
int i = 0;while (i * i < 100000) { i++;}System.out.println("i = " + i);System.out.println("i * i = " + (i * i));
輸出結果如下:
i = 317i * i = 100489
上述程式碼的目的是找到平方數小於100000的最大整數。使用while迴圈需要注意幾點,while迴圈條件陳述式中只能寫一個運算式,而且是一個布爾型運算式,那麼如果迴圈體中需要迴圈變數,就必須在while語句之前對迴圈變數進行初始化。本例中先給i賦值為0,然後在迴圈體內部必須通過語句更改迴圈變數的值,否則將會發生死迴圈。
7.2.2 do-while語句
do-while語句的使用與while語句相似,不過do-while語句是事後判斷迴圈條件結構,語句格式如下:
do { 語句組} while (迴圈條件)
do-while迴圈沒有初始化語句,迴圈次數是不可知的,不管迴圈條件是否滿足,都會先執行一次迴圈體,然後再判斷迴圈條件。如果條件滿足則執行迴圈體,不滿足則停止迴圈。
下面看一個範例程式碼:
int i = 0;do { i++;} while (i * i < 100000);System.out.println("i = " + i);System.out.println("i * i = " + (i * i));
輸出結果如下:
i = 317i * i = 100489
該樣本與上一節的樣本是一樣的,都是找到平方數小於100000的最大整數。輸出結果也是一樣的。
7.2.3 for語句
for語句是應用最廣泛、功能最強的一種迴圈語句。一般格式如下:
for (初始化; 迴圈條件; 迭代) { 語句組}
for語句執行流程7-1所示,首先會先執行初始化語句,它的作用是初始化迴圈變數和其他變數,然後程式會判斷迴圈條件是否滿足,如果滿足,則繼續執行迴圈體並計算迭代語句,之後再判斷迴圈條件,如此反覆,直到判斷迴圈條件不滿足時跳出迴圈。
以下範例程式碼是計算1~9的平方表程式:
System.out.println("---------");for (int i = 1; i < 10; i++) { System.out.printf("%d x %d = %d", i, i, i * i); //列印一個分行符號,實現換行 System.out.println();}
輸出結果如下:
---------1 x 1 = 12 x 2 = 43 x 3 = 94 x 4 = 165 x 5 = 256 x 6 = 367 x 7 = 498 x 8 = 649 x 9 = 81
在這個程式的迴圈部分初始時,給迴圈變數i賦值為1,每次迴圈都要判斷i的值是否小於10,如果為true,則執行迴圈體,然後給i加1。因此,最後的結果是列印出1~9的平方,不包括10。
提示 初始化、迴圈條件以及迭代部分都可以為空白語句(但分號不能省略),三者均為空白的時候,相當於一個無限迴圈。代碼如下:**
for (; ;) { ...}
另外,在初始化部分和迭代部分,可以使用逗號語句來進行多個操作。逗號語句是用逗號分隔的語句序列,如下程式碼所示:
int x;int y;for (x = 0, y = 10; x < y; x++, y--) { System.out.printf("(x,y) = (%d, %d)", x, y); // 列印一個分行符號,實現換行 System.out.println();}
輸出結果如下:
(x,y) = (0,10)(x,y) = (1,9)(x,y) = (2,8)(x,y) = (3,7)(x,y) = (4,6)
7.2.4 for-each語句
Java 5之後提供了一種專門用於遍曆集合的for迴圈——for-each迴圈。使用for-each迴圈不必按照for的標準套路編寫代碼,只需要提供一個集合就可以遍曆。
假設有一個數組,採用for語句遍曆數組的方式如下:
// 聲明並初始化int數組int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };System.out.println("----for-------");// for語句for (int i = 0; i < numbers.length; i++) { System.out.println("Count is:" + numbers[i]);}
上述語句int[] numbers = { 43, 32, 53, 54, 75, 7, 10 }聲明並初始化了10個元素數組集合,目前大家只需要知道當初始化數組時,要把相同類型的元素放到{…}中並且用逗號分隔(,)即可,關於數組集合會在後面第8章詳細介紹。numbers.length是獲得數組的長度,length是數組的屬性,numbers[i]是通過數組下標訪問數組元素。
那麼採用for-each迴圈語句遍曆數組的方式如下:
// 聲明並初始化int數組int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };System.out.println("----for each----");// for-each語句for (int item : numbers) { System.out.println("Count is:" + item);}
從樣本中可以發現,item不是迴圈變數,它儲存了集合中的元素,的for-each語句將集合中的元素一一取出來,並儲存到item中,這個過程中不需要使用迴圈變數,通過數組下標訪問數組中的元素。可見for-each語句在遍曆集合的時候要簡單方便得多。
7.3 跳躍陳述式
跳躍陳述式能夠改變程式的執行順序,可以實現程式的跳轉。Java有4種跳躍陳述式:break、continue、throw和return。本章重點介紹break和continue語句的使用。throw和return將後面章節介紹。
7.3.1 break語句
break語句可用於上一節介紹的while、repeat-while和for迴圈結構,它的作用是強行退出迴圈體,不再執行迴圈體中剩餘的語句。
在迴圈體中使用break語句有兩種方式:帶有標籤和不帶標籤。文法格式如下:
break; //不帶標籤break label; //帶標籤,label是標籤名
不帶標籤的break語句使程式跳出所在層的迴圈體,而帶標籤的break語句使程式跳出標籤指示的迴圈體。
下面看一個樣本,代碼如下:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };for (int i = 0; i < numbers.length; i++) { if (i == 3) { //跳出迴圈 break; } System.out.println("Count is: " + i);}
在上述程式碼中,當條件i==3的時候執行break語句,break語句會終止迴圈,程式啟動並執行結果如下:
Count is: 0Count is: 1Count is: 2
break還可以配合標籤使用,範例程式碼如下:
label1: for (int x = 0; x < 5; x++) { ① for (int y = 5; y > 0; y--) { ② if (y == x) { //跳轉到label1指向的迴圈 break label1; ③ } System.out.printf("(x,y) = (%d,%d)", x, y); // 列印一個分行符號,實現換行 System.out.println(); }}System.out.println("Game Over!");
預設情況下,break只會跳出最近的內迴圈(代碼第②行for迴圈)。如果要跳出代碼第①行的外迴圈,可以為外迴圈添加一個標籤label1,注意在定義標籤的時候後面跟一個冒號。代碼第③行的break語句後面指定了label1標籤,這樣當條件滿足執行break語句時,程式就會跳轉出label1標籤所指定的迴圈。
程式運行結果如下:
(x,y) = (0,5)(x,y) = (0,4)(x,y) = (0,3)(x,y) = (0,2)(x,y) = (0,1)(x,y) = (1,5)(x,y) = (1,4)(x,y) = (1,3)(x,y) = (1,2)Game Over!
如果break後面沒有指定外迴圈標籤,則運行結果如下:
(x,y) = (0,5)(x,y) = (0,4)(x,y) = (0,3)(x,y) = (0,2)(x,y) = (0,1)(x,y) = (1,5)(x,y) = (1,4)(x,y) = (1,3)(x,y) = (1,2)(x,y) = (2,5)(x,y) = (2,4)(x,y) = (2,3)(x,y) = (3,5)(x,y) = (3,4)(x,y) = (4,5)Game Over!
比較兩種運行結果,就會發現給break添加標籤的意義,添加標籤對於多層嵌套迴圈是很有必要的,適當使用可以提高程式的執行效率。
7.3.2 continue語句
continue語句用來結束本次迴圈,跳過迴圈體中尚未執行的語句,接著進行終止條件的判斷,以決定是否繼續迴圈。對於for語句,在進行終止條件的判斷前,還要先執行迭代語句。
在迴圈體中使用continue語句有兩種方式可以帶有標籤,也可以不帶標籤。文法格式如下:
continue //不帶標籤continue label //帶標籤,label是標籤名
下面看一個樣本,代碼如下:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };for (int i = 0; i < numbers.length; i++) { if (i == 3) { continue; } System.out.println("Count is: " + i);}
在上述程式碼中,當條件i==3的時候執行continue語句,continue語句會終止本次迴圈,迴圈體中continue之後的語句將不再執行,接著進行下次迴圈,所以輸出結果中沒有3。程式運行結果如下:
Count is: 0Count is: 1Count is: 2Count is: 4Count is: 5Count is: 6Count is: 7Count is: 8Count is: 9
帶標籤的continue語句範例程式碼如下:
label1: for (int x = 0; x < 5; x++) { ① for (int y = 5; y > 0; y--) { ② if (y == x) { continue label1; ③ } System.out.printf("(x,y) = (%d,%d)", x, y); System.out.println(); }}System.out.println("Game Over!");
預設情況下,continue只會跳出最近的內迴圈(代碼第②行for迴圈),如果要跳出代碼第①行的外迴圈,可以為外迴圈添加一個標籤label1,然後在第③行的continue語句後面指定這個標籤label1,這樣當條件滿足執行continue語句時,程式就會跳轉出外迴圈。
程式運行結果如下:
(x,y) = (0,5)(x,y) = (0,4)(x,y) = (0,3)(x,y) = (0,2)(x,y) = (0,1)(x,y) = (1,5)(x,y) = (1,4)(x,y) = (1,3)(x,y) = (1,2)(x,y) = (2,5)(x,y) = (2,4)(x,y) = (2,3)(x,y) = (3,5)(x,y) = (3,4)(x,y) = (4,5)Game Over!
由於跳過了x == y,因此下面的內容沒有輸出。
(x,y) = (1,1)(x,y) = (2,2)(x,y) = (3,3)(x,y) = (4,4)
本章小結
通過對本章內容的學習,讀者可以瞭解到Java語言的控制語句,其中包括分支語句(if和switch)、迴圈語句(while、do-while、for和for-each)和跳躍陳述式(break和continue)等。
配套視頻
http://edu.51cto.com/topic/1507.html
配套原始碼
http://www.zhijieketang.com/group/5
與本書免費版對應的還有一個收費版本:
-
進入百度閱讀電子書
- 進入圖靈社區電子書
《Java從小白到大牛》之第7章 控制語句