1. 程式人生 > >《Java從小白到大牛》之第7章 控制語句

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

編寫代碼 計算表達式 .html sco ber 多分支 聲明 簽名 group

《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 = 317
i * 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 = 317
i * 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 = 1
2 x 2 = 4
3 x 3 = 9
4 x 4 = 16
5 x 5 = 25
6 x 6 = 36
7 x 7 = 49
8 x 8 = 64
9 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: 0
Count is: 1
Count 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: 0
Count is: 1
Count is: 2
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count 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章 控制語句