官术网_书友最值得收藏!

1.8 分支結構

分支結構提供了這樣一種控制機制:它根據條件值的不同選擇執行不同的語句序列,其他與條件值不匹配的語句序列則被跳過不執行。這對應現實生活中“如果明天是雨天,我們做XX;如果明天是晴天,我們做YY”這樣的句式。

1.8.1 if…else分支結構

Java語言中,最簡單的分支結構是if結構,采用格式如下:

說明:如果條件表達式的值為true,就執行語句1,接下來順序執行后續語句序列;否則,不執行語句1,直接執行后續語句序列。

例如:

if(x>y)  x=y;

如果x大于y,就把y的值賦給x。

當條件為true,且要執行的語句不只一條語句時,將這些語句用花括號({ })括起來,形成一條復合語句。

例如,如果x的值大于y,將x和y的值交換,可以用以下語句實現。

if語句的執行流程如圖1-24所示。

圖1-24 if語句的執行流程

注意:if語句后合法的條件值是布爾類型。if語句后的條件,不管是簡單還是復雜,都應使用小括號包含起來。

【思考】在已有語句“int i=0;”的前提下,下面哪一個是正確的if語句?

A.if(i!=2){}  B.if(!i){}  C.if(i){}  D.if(i=2){}

學過C++的讀者看了之后會覺得前三項都是正確的。而在Java中,if后的部分,必須是一個布爾值。因此,只有A選項“if(i!=2){}”是正確的if語句。

簡單的if語句只能處理一部分問題,如果條件表達式的值為假也能進行相應操作,此時就要用到if…else語句。

if…else語句的格式如下:

說明:當條件表達式的值為true時,執行語句序列1,然后跳過語句序列2執行后續語句序列;當條件表達式的值為false時,跳過語句序列1,執行語句序列2,然后執行后續語句序列。

注意:else子句不能單獨作為語句使用,它必須和if子句配對使用。

下面舉一個簡單的例子:

1.8.2 if…else嵌套

有時候,簡單的if…else分支情況還不足以用來描述現實生活中的問題。以閏年為例,閏年的年份可被4整除且不能被100整除,或者能被400整除。這樣的問題,就需要用if…else的嵌套。語法與前面類似,只是需要注意:在嵌套使用if…else語句時,if和else一定要配對使用,else總是與它上面最近的if配對。記住,一個else語句總是和它同在一個塊的最近的if語句相匹配,并且該if語句沒有和其他的else關聯。

分析下面的代碼片段,執行后輸出的i值是多少?

雖然代碼看起來很復雜,但實際上第一個if選擇就不滿足,因此將直接執行輸出語句,輸出的i值為2。

可以嵌套使用if和else if語句,例如:

1.8.3 switch語句

if和if…else語句只有兩個分支可供選擇執行,而實際問題中卻經常遇到多分支選擇執行的情況,雖然可以使用嵌套的if和if…else語句來處理。但是多重嵌套的if語句會造成代碼冗長而降低程序的可讀性。在Java語言中,使用switch語句實現多分支條件選擇。它根據一個變量或表達式的值來執行不同的操作語句。

switch語句的格式如下:

說明:switch語句的執行過程如下。根據表達式的值來判斷,表達式的值和value的值相同就進入相應的case語句,執行相應的語句序列,遇到break,就跳出switch語句,執行后續語句序列;如果表達式的值與任何value都不相同,此時如果有default語句,就進入執行其中的語句序列,沒有default語句,就直接跳出switch語句,執行后續語句序列。

使用switch語句需要注意以下幾點:

(1)表達式的值只能是int、byte、short或char類型中的一種。

(2)case子句中的值value必須是上述4種類型的常量,而且所有case子句中的值應該不相同。

(3)break語句用來執行完一個case分支后,使程序跳出switch結構。因為case子句只起到一個標號作用,用來查找匹配的程序入口并從此處開始執行。如果沒有break語句,當程序執行完匹配的case語句序列后,還會繼續執行后面的case語句中的語句序列。

(4)在一些特殊的情況下,多個相鄰的case分支執行一組相同的操作。為了簡化程序的編寫,相同的程序段只需出現一次,即出現在最后一個case分支中。為了保證這組case分支都能執行正確的操作,只在這組case分支的最后一個case分支后加break語句。例如:

在選擇分支結構時注意,用于比較的是double類型時,不能選擇switch語句。也就是if語句能實現的功能,switch未必能實現。二者有各自的應用場景。switch后表達式的類型必須為char、byte、short、int,不能是整型中的long,更不能是float或double類型。

1.8.4 編程實例

【程序1-4】編寫程序,對三個整型變量進行排序,按照從小到大的順序排列,要求使用簡單的if分支結構。

【分析】程序中定義了一個臨時變量t。當要交換兩個相同類型的變量中所存放的值時,一般都需要再定義一個變量。就好像兩個杯子中裝了兩種不同的液體,要把兩個杯子中裝的液體交換,需要借助第三個空杯子來完成。

對數值進行排序如圖1-25所示。

圖1-25 對數值進行排序

【程序1-5】用if語句的嵌套,根據學生的成績判斷等級。

圖1-26 判斷學生成績的等級

【分析】學生成績分為不及格、及格、中、良、優5個等級。在使用if語句時,需要用到if的嵌套。一般情況下,if語句的嵌套不要超過三個層次。

判斷學生成績的等級如圖1-26所示。

【程序1-6】在程序中編寫一個名為showDays的方法,要求使用switch結構,根據傳遞的表示月份的參數,顯示該月有多少天。程序中假定2月份固定為28天,不考慮閏年問題。

【分析】因為不考慮閏年問題,假定2月份的天數固定為28天。剩下的11個月中,1月、3月、5月、7月、8月、10月、12月是31天,而4月、6月、9月、11月是30天。為了讓程序簡單,switch語句中把2月份和其他為30天的月份列出來了。剩下的情況,執行default分支部分。

switch演示如圖1-27所示。

圖1-27 switch演示

主站蜘蛛池模板: 肥西县| 基隆市| 华阴市| 定襄县| 张家川| 哈巴河县| 日土县| 松原市| 中西区| 玉环县| 涞源县| 吕梁市| 怀柔区| 伊宁县| 资源县| 洱源县| 新巴尔虎右旗| 龙门县| 东兰县| 阳朔县| 三台县| 龙川县| 泰州市| 定州市| 水城县| 布拖县| 高安市| 长岭县| 吉隆县| 海口市| 汾阳市| 鄱阳县| 永福县| 龙岩市| 磴口县| 连云港市| 滨海县| 铁岭市| 特克斯县| 紫云| 汝州市|