編程語言使用控制(control )語句來產(chǎn)生執(zhí)行流,從而完成程序狀態(tài)的改變,如程序順序執(zhí)行和分支執(zhí)行。Java 的程序控制語句分為以下幾類:選擇,重復(fù)和跳轉(zhuǎn)。根據(jù)表達(dá)式結(jié)果或變量狀態(tài)選擇(Selection )語句來使你的程序選擇不同的執(zhí)行路徑。重復(fù)(Iteration)語句使程序能夠重復(fù)執(zhí)行一個或一個以上語句(也就是說,重復(fù)語句形成循環(huán))。跳轉(zhuǎn)(Jump )語句允許你的程序以非線性的方式執(zhí)行。下面將分析Java 的所有控制語句。
如果你熟悉C/C++ ,那么掌握J(rèn)ava 的控制語句將很容易。事實上,Java 的控制語句與C/C++ 中的語句幾乎完全相同。當(dāng)然它們還是有一些差別的——尤其是break語句與continue 語句。
Java 支持兩種選擇語句:if語句和switch語句。這些語句允許你只有在程序運行時才能知道其狀態(tài)的情況下,控制程序的執(zhí)行過程。如果你沒有C/C++ 的編程背景,你將會為這兩個語句的強大功能和靈活性而感到吃驚。
5.1.1 if語句
if語句曾在第2章中介紹過,我們將在這里對它進(jìn)行詳細(xì)討論。if語句是Java 中的條件分支語句。它能將程序的執(zhí)行路徑分為兩條。if語句的完整格式如下:
if (condition) statement1;
else statement2;
其中,if和else的對象都是單個語句(statement ),也可以是程序塊。條件condition 可以是任何返回布爾值的表達(dá)式。else子句是可選的。
if語句的執(zhí)行過程如下:如果條件為真,就執(zhí)行if的對象(statement1 );否則,執(zhí)行else 的對象(statement2 )。任何時候兩條語句都不可能同時執(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)系運算符。當(dāng)然,這在技術(shù)上并不是必要的。僅用一個布爾值來控制if語句也是可以的,如下面的程序段:
boolean dataAvailable;
// ...
if (dataAvailable)
ProcessData();
else
waitForMoreData();
記住,直接跟在if 或else語句后的語句只能有一句。如果你想包含更多的語句,你需要建一個程序塊,如下面的例子:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;} elsewaitForMoreData();
這里,如果變量bytesAvailable 大于0,則if塊內(nèi)的所有語句都會執(zhí)行。
一些程序員覺得在使用if語句時在其后跟一個大括號是很方便的,甚至在只有一條語句的時侯也使用大括號。這使得在日后添加別的語句變得容易,并且你也不必?fù)?dān)心忘記括號。事實上,當(dāng)需要定義塊時而未對其進(jìn)行定義是一個導(dǎo)致錯誤的普遍原因。例如,考慮下面的程序段:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;
} else
waitForMoreData();
bytesAvailable = n;
由于編排的原因,看起來似乎bytesAvailable = n 語句應(yīng)該在else子句中執(zhí)行。然而,當(dāng)你調(diào)用時,空白對Java 無關(guān)緊要,編譯器無法知道你的意圖。這段程序會通過編譯,但運用時會出錯。上述例子應(yīng)修改如下:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else {
waitForMoreData();
bytesAvailable = n;
}
嵌套if 語句
嵌套(nested)if語句是指該if語句為另一個if或者else 語句的對象。在編程時經(jīng)常要用到嵌套if語句。當(dāng)你使用嵌套if語句時,需記住的要點就是:一個else語句總是對應(yīng)著和它在同一個塊中的最近的if語句,而且該if語句沒有與其他else語句相關(guān)聯(lián)。下面是一個例子:
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)
如注釋所示,最后一個else語句沒有與if(j <20 )相對應(yīng),因為它們不在同一個塊(盡管if(j <20 )語句是沒有與else配對最近的if語句)。最后一個else語句對應(yīng)著if(i==10 )。內(nèi)部的else語句對應(yīng)著if(k>100 ),因為它是同一個塊中最近的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語句,而且所有其他的條件都失敗,那程序就不做任何動作。
如果你熟悉C/C++ ,那么掌握J(rèn)ava 的控制語句將很容易。事實上,Java 的控制語句與C/C++ 中的語句幾乎完全相同。當(dāng)然它們還是有一些差別的——尤其是break語句與continue 語句。
Java 支持兩種選擇語句:if語句和switch語句。這些語句允許你只有在程序運行時才能知道其狀態(tài)的情況下,控制程序的執(zhí)行過程。如果你沒有C/C++ 的編程背景,你將會為這兩個語句的強大功能和靈活性而感到吃驚。
5.1.1 if語句
if語句曾在第2章中介紹過,我們將在這里對它進(jìn)行詳細(xì)討論。if語句是Java 中的條件分支語句。它能將程序的執(zhí)行路徑分為兩條。if語句的完整格式如下:
if (condition) statement1;
else statement2;
其中,if和else的對象都是單個語句(statement ),也可以是程序塊。條件condition 可以是任何返回布爾值的表達(dá)式。else子句是可選的。
if語句的執(zhí)行過程如下:如果條件為真,就執(zhí)行if的對象(statement1 );否則,執(zhí)行else 的對象(statement2 )。任何時候兩條語句都不可能同時執(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)系運算符。當(dāng)然,這在技術(shù)上并不是必要的。僅用一個布爾值來控制if語句也是可以的,如下面的程序段:
boolean dataAvailable;
// ...
if (dataAvailable)
ProcessData();
else
waitForMoreData();
記住,直接跟在if 或else語句后的語句只能有一句。如果你想包含更多的語句,你需要建一個程序塊,如下面的例子:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;} elsewaitForMoreData();
這里,如果變量bytesAvailable 大于0,則if塊內(nèi)的所有語句都會執(zhí)行。
一些程序員覺得在使用if語句時在其后跟一個大括號是很方便的,甚至在只有一條語句的時侯也使用大括號。這使得在日后添加別的語句變得容易,并且你也不必?fù)?dān)心忘記括號。事實上,當(dāng)需要定義塊時而未對其進(jìn)行定義是一個導(dǎo)致錯誤的普遍原因。例如,考慮下面的程序段:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();bytesAvailable -= n;
} else
waitForMoreData();
bytesAvailable = n;
由于編排的原因,看起來似乎bytesAvailable = n 語句應(yīng)該在else子句中執(zhí)行。然而,當(dāng)你調(diào)用時,空白對Java 無關(guān)緊要,編譯器無法知道你的意圖。這段程序會通過編譯,但運用時會出錯。上述例子應(yīng)修改如下:
int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else {
waitForMoreData();
bytesAvailable = n;
}
嵌套if 語句
嵌套(nested)if語句是指該if語句為另一個if或者else 語句的對象。在編程時經(jīng)常要用到嵌套if語句。當(dāng)你使用嵌套if語句時,需記住的要點就是:一個else語句總是對應(yīng)著和它在同一個塊中的最近的if語句,而且該if語句沒有與其他else語句相關(guān)聯(lián)。下面是一個例子:
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)
如注釋所示,最后一個else語句沒有與if(j <20 )相對應(yīng),因為它們不在同一個塊(盡管if(j <20 )語句是沒有與else配對最近的if語句)。最后一個else語句對應(yīng)著if(i==10 )。內(nèi)部的else語句對應(yīng)著if(k>100 ),因為它是同一個塊中最近的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語句,而且所有其他的條件都失敗,那程序就不做任何動作。