您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何分析Java的選擇語句,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
編程語言使用控制(control )語句來產(chǎn)生執(zhí)行流,從而完成程序狀態(tài)的改變,如程序順序執(zhí)行和分支執(zhí)行。Java 的程序控制語句分為以下幾類:選擇,重復(fù)和跳轉(zhuǎn)。根據(jù)表達(dá)式結(jié)果或變量狀態(tài)選擇(Selection )語句來使你的程序選擇不同的執(zhí)行路徑。重復(fù)(Iteration)語句使程序能夠重復(fù)執(zhí)行一個(gè)或一個(gè)以上語句(也就是說,重復(fù)語句形成循環(huán))。跳轉(zhuǎn)(Jump )語句允許你的程序以非線性的方式執(zhí)行。下面將分析Java 的所有控制語句。
如果你熟悉C/C++ ,那么掌握J(rèn)ava 的控制語句將很容易。事實(shí)上,Java 的控制語句與C/C++ 中的語句幾乎完全相同。當(dāng)然它們還是有一些差別的——尤其是break語句與continue 語句。
Java 支持兩種選擇語句:if語句和switch語句。這些語句允許你只有在程序運(yùn)行時(shí)才能知道其狀態(tài)的情況下,控制程序的執(zhí)行過程。如果你沒有C/C++ 的編程背景,你將會(huì)為這兩個(gè)語句的強(qiáng)大功能和靈活性而感到吃驚。
1 if語句
if語句曾在第2章中介紹過,我們將在這里對(duì)它進(jìn)行詳細(xì)討論。if語句是Java 中的條件分支語句。它能將程序的執(zhí)行路徑分為兩條。if語句的完整格式如下:
if (condition) statement1;
else statement2;
其中,if和else的對(duì)象都是單個(gè)語句(statement ),也可以是程序塊。條件condition 可以是任何返回布爾值的表達(dá)式。else子句是可選的。
if語句的執(zhí)行過程如下:如果條件為真,就執(zhí)行if的對(duì)象(statement1 );否則,執(zhí)行else 的對(duì)象(statement2 )。任何時(shí)候兩條語句都不可能同時(shí)執(zhí)行??紤]下面的例子:
int a,b; // ...if(a < b) a = 0;else b = 0;
本例中,如果a小于b,那么a被賦值為0;否則,b被賦值為0。任何情況下都不可能使a 和b都被賦值為0。
通常,用于控制if語句的表達(dá)式都包含關(guān)系運(yùn)算符。當(dāng)然,這在技術(shù)上并不是必要的。僅用一個(gè)布爾值來控制if語句也是可以的,如下面的程序段:
boolean dataAvailable;
// ...
if (dataAvailable)
ProcessData();
else
waitForMoreData();
記住,直接跟在if 或else語句后的語句只能有一句。如果你想包含更多的語句,你需要建一個(gè)程序塊,如下面的例子:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;} elsewaitForMoreData();
這里,如果變量bytesAvailable 大于0,則if塊內(nèi)的所有語句都會(huì)執(zhí)行。
一些程序員覺得在使用if語句時(shí)在其后跟一個(gè)大括號(hào)是很方便的,甚至在只有一條語句的時(shí)侯也使用大括號(hào)。這使得在日后添加別的語句變得容易,并且你也不必?fù)?dān)心忘記括號(hào)。事實(shí)上,當(dāng)需要定義塊時(shí)而未對(duì)其進(jìn)行定義是一個(gè)導(dǎo)致錯(cuò)誤的普遍原因。例如,考慮下面的程序段:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;
} else
waitForMoreData();
bytesAvailable = n;
由于編排的原因,看起來似乎bytesAvailable = n 語句應(yīng)該在else子句中執(zhí)行。然而,當(dāng)你調(diào)用時(shí),空白對(duì)Java 無關(guān)緊要,編譯器無法知道你的意圖。這段程序會(huì)通過編譯,但運(yùn)用時(shí)會(huì)出錯(cuò)。上述例子應(yīng)修改如下:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else {
waitForMoreData();
bytesAvailable = n;
}
嵌套if 語句
嵌套(nested)if語句是指該if語句為另一個(gè)if或者else 語句的對(duì)象。在編程時(shí)經(jīng)常要用到嵌套if語句。當(dāng)你使用嵌套if語句時(shí),需記住的要點(diǎn)就是:一個(gè)else語句總是對(duì)應(yīng)著和它在同一個(gè)塊中的最近的if語句,而且該if語句沒有與其他else語句相關(guān)聯(lián)。下面是一個(gè)例子:
if(i == 10) {if(j < 20) a = b;if(k > 100) c = d; // this if iselse a = c; // associated with this else
}
else a = d; // this else refers to if(i == 10)
如注釋所示,最后一個(gè)else語句沒有與if(j<20 )相對(duì)應(yīng),因?yàn)樗鼈儾辉谕粋€(gè)塊(盡管if(j <20 i="=10" k="">100 ),因?yàn)樗峭粋€(gè)塊中最近的if語句。
if-else-if 階梯
基于嵌套if語句的通用編程結(jié)構(gòu)被稱為 if-else-if 階梯。它的語法如下:
if(condition) statement; else if(condition) statement; else if(condition)
statement;
.
.
.
else
statement;
條件表達(dá)式從上到下被求值。一旦找到為真的條件,就執(zhí)行與它關(guān)聯(lián)的語句,該階梯的其他部分就被忽略了。如果所有的條件都不為真,則執(zhí)行最后的else語句。最后的else語句經(jīng)常被作為默認(rèn)的條件,即如果所有其他條件測試失敗,就執(zhí)行最后的else語句。如果沒有最后的else語句,而且所有其他的條件都失敗,那程序就不做任何動(dòng)作。
下面的程序通過使用if-else-if 階梯來確定某個(gè)月是什么季節(jié)。
// Demonstrate if-else-if statements.
class IfElse {
public static void main(String args[]) {
int month = 4; // April
String season;
if(month == 12 || month == 1 || month == 2)
season = "Winter";
else if(month == 3 || month == 4 || month == 5)
season = "Spring";
else if(month == 6 || month == 7 || month == 8)
season = "Summer";
else if(month == 9 || month == 10 || month == 11)
season = "Autumn";
else
season = "Bogus Month";
System.out.println("April is in the " + season + ".");
}
}
該程序產(chǎn)生如下輸出:
April is in the Spring.
在往下繼續(xù)講之前,你可能想要先試驗(yàn)這個(gè)程序。你將看到,不管你給month 什么值,該階梯中有而且只有一個(gè)語句執(zhí)行。
2 switch 語句
switch語句是Java 的多路分支語句。它提供了一種基于一個(gè)表達(dá)式的值來使程序執(zhí)行不同部分的簡單方法。因此,它提供了一個(gè)比一系列if-else-if 語句更好的選擇。switch 語句的通用形式如下:
switch (expression) {
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
.
.
.
case valueN:
// statement sequence
break;
default:
// default statement sequence
}
表達(dá)式expression 必須為byte,short,int 或char類型。每個(gè)case語句后的值value 必須是與表達(dá)式類型兼容的特定的一個(gè)常量(它必須為一個(gè)常量,而不是變量)。重復(fù)的case值是不允許的。
switch 語句的執(zhí)行過程如下:表達(dá)式的值與每個(gè)case語句中的常量作比較。如果發(fā)現(xiàn)了一個(gè)與之相匹配的,則執(zhí)行該case語句后的代碼。如果沒有一個(gè)case常量與表達(dá)式的值相匹配,則執(zhí)行default 語句。當(dāng)然,default 語句是可選的。如果沒有相匹配的case 語句,也沒有default 語句,則什么也不執(zhí)行。
在case語句序列中的break 語句將引起程序流從整個(gè)switch 語句退出。當(dāng)遇到一個(gè)break 語句時(shí),程序?qū)恼麄€(gè)switch 語句后的第一行代碼開始繼續(xù)執(zhí)行。這有一種“跳出” switch 語句的效果。
下面是一個(gè)使用switch語句的簡單例子:
// A simple example of the switch.
class SampleSwitch {
public static void main(String args[]) {
for(int i=0; i<6; i++)
switch(i) {
case 0:
System.out.println("i is zero.");
break;
case 1:
System.out.println("i is one.");
break;
case 2:
System.out.println("i is two.");
break;
case 3:
System.out.println("i is three.");
break;
default:
System.out.println("i is greater than 3.");
}
}
}
該程序的輸出如下:
i is zero.
i is one.
i is two.
i is three.
i is greater than 3.
i is greater than 3.
從中可以看出,每一次循環(huán),與i值相配的case常量后的相關(guān)語句就被執(zhí)行。其他語句則被忽略。當(dāng)i大于3時(shí),沒有可以匹配的case語句,因此執(zhí)行 default 語句。break語句是可選的。如果你省略了break 語句,程序?qū)⒗^續(xù)執(zhí)行下一個(gè)case語句。有時(shí)需要在多個(gè)case語句之間沒有break 語句。例如下面的程序:
// In a switch, break statements are optional.
class MissingBreak {
public static void main(String args[]) {
for(int i=0; i<12; i++)
switch(i) {
case 0:
case 1:
case 2:
case 3:
case 4:
System.out.println("i is less than 5");
break;
case 5:
case 6:
case 7:
case 8:
case 9:
System.out.println("i is less than 10");
break;
default:
System.out.println("i is 10 or more");
}
}
}
該程序產(chǎn)生的輸出如下:
i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is 10 or more
i is 10 or more
正如該程序所演示的那樣,如果沒有break語句,程序?qū)⒗^續(xù)執(zhí)行下面的每一個(gè)case語
句,直到遇到break 語句(或switch語句的末尾)。當(dāng)然該例子是為了示例而人為構(gòu)造的,省略break語句在真實(shí)的程序中有許多實(shí)際的應(yīng)
用。為了說明它更現(xiàn)實(shí)的用法,讓我們考慮下例對(duì)以前顯示季節(jié)例子的重寫。這個(gè)重寫的
版本使用switch語句來使程序的執(zhí)行更高效。
// An improved version of the season program.
class Switch {
public static void main(String args[]) {
int month = 4;
String season;
switch (month) {
case 12:
case 1:
case 2:
season = "Winter";
break;
case 3:
case 4:
case 5:
season = "Spring";
break;
case 6:
case 7:
case 8:
season = "Summer";
break;
case 9:
case 10:
case 11:
season = "Autumn";
break;
default:
season = "Bogus Month";}System.out.println("April is in the " + season + ".");
}
}
嵌套switch 語句
可以將一個(gè)switch語句作為一個(gè)外部switch語句的語句序列的一部分,這稱為嵌套switch語句。因?yàn)橐粋€(gè)switch語句定義了自己的塊,外部switch語句和內(nèi)部switch語句的case 常量不會(huì)產(chǎn)生沖突。例如,下面的程序段是完全正確的:
switch(count) {
case 1:
switch(target) { // nested switch
case 0:
System.out.println("target is zero");
break;
case 1: // no conflicts with outer switch
System.out.println("target is one");
break; }
break;
case 2: // ...
本例中,內(nèi)部switch語句中的 case 1 :語句與外部switch語句中的case 1:語句不沖突。變量count僅與外層的case語句相比較。如果變量count 為1,則變量target 與內(nèi)層的case語句相比較。
概括起來說,switch語句有3個(gè)重要的特性需注意:
·
switch語句不同于if語句的是switch語句僅能測試相等的情況,而if語句可計(jì)算任何類型的布爾表達(dá)式。也就是switch語句只能尋找case常量間某個(gè)值與表達(dá)式的值相匹配。
·
在同一個(gè)switch語句中沒有兩個(gè)相同的case常量。當(dāng)然,外部switch語句中的case常量可以和內(nèi)部switch語句中的case常量相同。
·
switch語句通常比一系列嵌套if語句更有效。
最后一點(diǎn)尤其有趣,因?yàn)樗刮覀冎繨ava 編譯器如何工作。當(dāng)編譯一個(gè)switch語句時(shí),Java 編譯器將檢查每個(gè)case常量并且創(chuàng)造一個(gè)“跳轉(zhuǎn)表”,這個(gè)表將用來在表達(dá)式值的基礎(chǔ)上選擇執(zhí)行路徑。因此,如果你需要在一組值中做出選擇,switch 語句將比與之等效的if-else 語句快得多。編譯器可以這樣做是因?yàn)樗纁ase常量都是同類型的,所要做的只是將它與switch表達(dá)式相比較看是否相等。對(duì)于一系列的if表達(dá)式,編譯器就無此功能。
關(guān)于如何分析Java的選擇語句就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。