《Java從小白到大牛》之第7章 控制語句

來源:互聯網
上載者:User

標籤:情況   內容   一個   流程圖   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

與本書免費版對應的還有一個收費版本:
  1. 進入百度閱讀電子書

  2. 進入圖靈社區電子書

《Java從小白到大牛》之第7章 控制語句

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.