“=”稱為賦值運(yùn)算符,用于對(duì)變量賦值。關(guān)于賦值運(yùn)算符,除了將右邊的表達(dá)式計(jì)算出來(lái)賦給左邊以外還具備如下特點(diǎn):賦值表達(dá)式本身也有值,其本身之值即為所賦之值。示例代碼如下所示:
int num = 18, index;System.out.PRintln(index = num % 5); // 結(jié)果為:3,賦值表達(dá)式本身也有值System.out.println(index); // 結(jié)果為:3int a, b, c;a = b = c = 100; // c=100 整個(gè)表達(dá)式的值為100, 將其賦值給b,同樣b=(c=100)整個(gè)表達(dá)式的值也為100,然后有將這個(gè)值賦給了a,所以a 的值也是100。1.1.2. 使用擴(kuò)展賦值表達(dá)式
在賦值運(yùn)算符”= ”前加上其它運(yùn)算符,即為擴(kuò)展賦值運(yùn)算符,其效率高于賦值運(yùn)算符,推薦使用,擴(kuò)展賦值運(yùn)算符如下圖 - 5所示:

圖- 5
1.2. 字符連接運(yùn)算1.2.1. 使用“+”進(jìn)行字符串連接“+”除了可以進(jìn)行算術(shù)運(yùn)算以外,還可以實(shí)現(xiàn)字符串的連接,同時(shí)可以實(shí)現(xiàn)字符串與其他數(shù)據(jù)類型的“相連”。
當(dāng) + 號(hào)作用于兩個(gè)數(shù)字類型變量時(shí),是在進(jìn)行算術(shù)運(yùn)算。
當(dāng) + 號(hào)兩邊的變量有一個(gè)是字符串類型,即””括起來(lái)的時(shí)候,則其進(jìn)行的是字符串的連接,連接后的結(jié)果為字符串類型。示例代碼如下所示:
int a = 100;String msg = "a=" + a;System.out.println(msg); //a=100,字符串拼接msg = "" + 100 + 200;System.out.println(msg); //結(jié)果為: 100200,””+100,為字符串100再拼上200為100200msg = 100 + 200 + "";System.out.println(msg); //結(jié)果為:300,100+200為算術(shù)運(yùn)算結(jié)果為300,再加上””為3001.3. 條件(三目)運(yùn)算1.3.1. 使用條件(三目)運(yùn)算符
條件運(yùn)算符又稱“三目”運(yùn)算符,其結(jié)構(gòu)為:boolean表達(dá)式 ? 表達(dá)式1:表達(dá)式2。
條件運(yùn)算符的規(guī)則如下:
示例代碼如下:
int a = 100, b = 200;int flag = a > b ? 1 : -1; //因?yàn)閍>b為false,所以整個(gè)表達(dá)式的值為-1,將其賦給flag,即:flag的值為-1。1.3.2. 條件(三目)運(yùn)算符的嵌套
條件運(yùn)算符可以嵌套使用,所謂嵌套是指在條件(三目)表達(dá)式:“boolean表達(dá)式 ? 表達(dá)式1:表達(dá)式2”中的表達(dá)式1或表達(dá)式2也是條件(三目)表達(dá)式,相當(dāng)于多重判斷,示例代碼如下所示:
int a = -3;String r = a > 0 ? "正數(shù)" : (a == 0 ? "0":"負(fù)數(shù)");System.out.println(r); //結(jié)果為負(fù)數(shù),因?yàn)?a 的值小于 0,即boolean 表達(dá)式的值為 false ,則取問(wèn)號(hào)后第二個(gè)表達(dá)式的值作為表達(dá)式的結(jié)果。而問(wèn)號(hào)后的第二個(gè)表達(dá)式也是一個(gè)三目運(yùn)算符所構(gòu)成的表達(dá)式。因?yàn)?a==0 表達(dá)式的值為 false,則取“負(fù)數(shù)”為表達(dá)式的結(jié)果。2. 分支結(jié)構(gòu)2.1. 什么是分支結(jié)構(gòu)
首先,看一個(gè)需求,假設(shè)需要編寫一個(gè)收銀柜臺(tái)收款程序,要求根據(jù)商品單價(jià)、購(gòu)買數(shù)量以及收款金額,計(jì)算并輸出應(yīng)收金額和找零。
通過(guò)分析可以想到,這個(gè)程序,需要定義三個(gè)輸入,即:?jiǎn)蝺r(jià)、數(shù)量、金額。定義兩個(gè)輸出,即:應(yīng)收金額、找零。因?yàn)榻痤~有可能為小數(shù)類型,所以變量的數(shù)據(jù)結(jié)構(gòu)定義為double類型。
此程序可以以如下方式解決,用戶由控制臺(tái)輸入:商品單價(jià)、購(gòu)買數(shù)量、收款金額;而后計(jì)算商品的總價(jià)及找零,并輸出。示例代碼如下所示:
public static void main(String[] args) { //定義輸入 Scanner console = new Scanner(System.in); System.out.println("請(qǐng)輸入單價(jià)(¥):"); double unitPrice = console.nextDouble(); System.out.println("請(qǐng)輸入數(shù)量:"); double amount = console.nextDouble(); System.out.println("請(qǐng)輸入金額(¥):"); double money = console.nextDouble(); console.close(); //計(jì)算商品總價(jià) double totalPrice = unitPrice * amount; //計(jì)算找零 double change = money - totalPrice; //輸出 System.out.println("應(yīng)收金額為:" + totalPrice +",找零為:" + change); }如上代碼,輸入數(shù)據(jù)后,可以正確輸出應(yīng)收金額及找零,假設(shè)現(xiàn)在需求增加,當(dāng)商品總價(jià)滿500時(shí)享受8折優(yōu)惠, 如何解決?這種情況,在軟件應(yīng)用中,需要使用分支結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
任何復(fù)雜的程序邏輯結(jié)構(gòu)都可以通過(guò)“順序”,“分支”,“循環(huán)”這三種基本的程序結(jié)構(gòu)實(shí)現(xiàn)。如圖 – 1所示:

圖- 1
剛剛的案例即為順序結(jié)構(gòu),第一步A執(zhí)行完執(zhí)行第二步B,第二步執(zhí)行完執(zhí)行第三步,一步一步順序執(zhí)行。分支結(jié)構(gòu)即為根據(jù)一個(gè)條件做判斷,如果條件滿足則執(zhí)行A,否則執(zhí)行B。還有一種即為后面要介紹的循環(huán)結(jié)構(gòu)。原則上,任何復(fù)雜的程序, 都可以通過(guò)這三種結(jié)構(gòu)來(lái)解決。
當(dāng)程序在運(yùn)行過(guò)程中, 需要根據(jù)不同的條件而運(yùn)行不同的語(yǔ)句時(shí),即可以使用分支結(jié)構(gòu),java中有專門的語(yǔ)法結(jié)構(gòu)來(lái)實(shí)現(xiàn)分支:
首先看下面if語(yǔ)句的語(yǔ)法:
語(yǔ)句0;if(邏輯表達(dá)式){ 語(yǔ)句1; 語(yǔ)句2;}語(yǔ)句3;如上語(yǔ)句的執(zhí)行步驟如下所示:
步驟一:執(zhí)行語(yǔ)句0;
步驟二: 判斷邏輯表達(dá)式的值,此表達(dá)式的值結(jié)果為boolean類型,即true或者false。此處可以是關(guān)系表達(dá)式也可以是邏輯表達(dá)式。
步驟三:執(zhí)行語(yǔ)句3語(yǔ)句。
2.2.2. if語(yǔ)句流程圖if語(yǔ)句的執(zhí)行邏輯如下圖 - 2所示:

圖- 2
通過(guò)圖示得出結(jié)論:當(dāng)條件滿足時(shí),執(zhí)行語(yǔ)句塊,然后執(zhí)行if語(yǔ)句下面的語(yǔ)句;否則跳過(guò)語(yǔ)句塊,直接執(zhí)行if語(yǔ)句下面的語(yǔ)句。
2.2.3. if語(yǔ)句用于處理分支邏輯if語(yǔ)句是java中用于處理分支結(jié)構(gòu)的語(yǔ)句,下面,通過(guò)if語(yǔ)句來(lái)實(shí)現(xiàn)剛剛的打折功能邏輯,再回顧一下新添的需求:如果商品總價(jià)大于等于500,則打8折。如下圖– 3 紅色部分即為if的判斷邏輯:

圖- 3
可以看到,計(jì)算商品總價(jià)之后,進(jìn)行了總價(jià)大于等于500的業(yè)務(wù)判斷,若判斷結(jié)果為true,則計(jì)算折扣后的應(yīng)收金額,再計(jì)算找零后輸出。若判斷結(jié)果為false,則直接計(jì)算找零后輸出。如下即為實(shí)現(xiàn)代碼:
…… double totalPrice = ……; if (totalPrice >= 500) { totalPrice = totalPrice * 0.8; } ……
通過(guò)如上代碼可以看出: 當(dāng)total>=500為true時(shí), 總額乘以0.8, 即打8折。當(dāng)total>=500為false時(shí),不執(zhí)行if語(yǔ)句塊的內(nèi)容。
2.2.4. if語(yǔ)句塊不要省略“{}”if語(yǔ)句塊在執(zhí)行過(guò)程中,有一個(gè)問(wèn)題是需要注意的,先看下面的兩段代碼:
代碼一:
int num = 5;if(num>2) System.out.print(num); System.out.println(“ 大于2 ”);
代碼二:
int num = 5;if(num>2){ System.out.print(num); System.out.println(“ 大于2 ”);}分析如上兩個(gè)代碼段,得出的結(jié)論是:兩段代碼輸出結(jié)果一樣,即 “5 大于 2”。再看如下兩段代碼,輸出結(jié)果還一樣嗎?
代碼一:
int num = 5;if(num<2) System.out.println(num); System.out.println(“小于2”);
代碼二:
int num = 5;if(num<2){ System.out.print(num); System.out.println(“小于2”);}分析如上兩個(gè)代碼段,可以得出,代碼段一的輸出結(jié)果是“大于2”,代碼段二沒有任何輸出。分析輸出結(jié)果可以看出,代碼段二的結(jié)果為正確結(jié)果,而代碼段一輸出的“小于2”是不應(yīng)該存在的,出現(xiàn)這個(gè)問(wèn)題的原因在于,在if語(yǔ)句之后沒有添加“{}”,而java語(yǔ)法規(guī)定,當(dāng)if語(yǔ)句塊中只包含一條語(yǔ)句時(shí),可以省略“{}”,但是if語(yǔ)句塊也只能作用于它下面的一條語(yǔ)句。
看如上代碼段一的if判斷,只作用于第一個(gè)輸出語(yǔ)句,因?yàn)閚um<2結(jié)果為false,所以第一個(gè)輸出語(yǔ)句并未執(zhí)行,而第二個(gè)輸出語(yǔ)句“小于2”不屬于if作用范圍,所以無(wú)論條件滿足與否,都會(huì)執(zhí)行。故而,輸出了“小于2”的結(jié)果。
所以,考慮到代碼的可讀性、擴(kuò)展性,建議即便if語(yǔ)句塊中只有一條語(yǔ)句,也不要省略“{}”。
2.3. if-else語(yǔ)句2.3.1. if-else語(yǔ)句的執(zhí)行邏輯分析上面的案例,當(dāng)計(jì)算出最終(打折前、打折后)的應(yīng)收金額后,直接計(jì)算找零,這
個(gè)時(shí)候就出現(xiàn)了一個(gè)問(wèn)題,如果收款的金額小于應(yīng)收的金額,那么輸出的找零就會(huì)為負(fù)數(shù)結(jié)果,這顯然用戶體驗(yàn)不好,下面對(duì)它做一下改進(jìn),要求考慮程序的異常情況,增加需求如下:
這種情況,單單使用if語(yǔ)句顯然無(wú)法解決了,因?yàn)閕f語(yǔ)句用于解決的是,當(dāng)某條件滿足時(shí)執(zhí)行某段業(yè)務(wù)處理的邏輯,而現(xiàn)在的邏輯時(shí),當(dāng)條件滿足時(shí)執(zhí)行某段業(yè)務(wù)邏輯,當(dāng)條件不滿足時(shí)需要執(zhí)行另一段業(yè)務(wù)邏輯。看如下圖 – 4所示的紅色部分:

圖- 4
若想實(shí)現(xiàn)這樣的判斷邏輯,可以考慮if-else語(yǔ)句。看一下下面的語(yǔ)法:
語(yǔ)句0;if(邏輯表達(dá)式){ 語(yǔ)句塊1;} else { 語(yǔ)句塊2;}語(yǔ)句3;如上語(yǔ)句的執(zhí)行步驟如下所示:
步驟一:執(zhí)行語(yǔ)句0;
步驟二:判斷if邏輯表達(dá)式的值:
步驟三:執(zhí)行語(yǔ)句3語(yǔ)句。
2.3.2. if-else語(yǔ)句流程圖if-else語(yǔ)句的執(zhí)行邏輯如下圖 - 5所示:

圖- 5
通過(guò)圖-5可以看到:當(dāng)條件滿足時(shí),執(zhí)行語(yǔ)句塊1,然后執(zhí)行if-else語(yǔ)句下面的語(yǔ)句;否則執(zhí)行語(yǔ)句塊2,再執(zhí)行if-else語(yǔ)句下面的語(yǔ)句。
2.3.3. if-else語(yǔ)句用于處理分支邏輯通過(guò)下面的代碼,可以解決新增加的異常情況處理問(wèn)題:
……if( money >= totalPrice ) { double change = money – totalPrice; System.out.println("應(yīng)收金額為:" + totalPrice +",找零為:" + change);} else { System.out.println(“Error! 收款金額小于應(yīng)收金額”);}說(shuō)明:money為收款金額,totalPrice為應(yīng)收金額;當(dāng)收款金額大于等于應(yīng)收金額時(shí),則計(jì)算找零并輸出,否則,提示錯(cuò)誤信息。
2.4. else if語(yǔ)句2.4.1. if-else語(yǔ)句的嵌套在日常生活中,很多情況并非進(jìn)行一次邏輯判斷就可以獲取最終的結(jié)果, 如圖– 6所示:

圖 - 6
可以看出,實(shí)現(xiàn)制作沙拉的過(guò)程進(jìn)行了兩次判斷,首先判斷是否有黃瓜,若有則直接制作黃瓜沙拉后結(jié)束,若沒有黃瓜則判斷是否有胡蘿卜,若有則制作胡蘿卜沙拉結(jié)束,沒有則不能上菜結(jié)束。這種情況,單單使用if-else還無(wú)法實(shí)現(xiàn),因?yàn)閕f-else只是判斷了一次就結(jié)束了,而當(dāng)前的情況需要判斷兩次。
在java程序中,當(dāng)程序的分支數(shù)大于2時(shí),可以用if-else嵌套的方式解決,即:else語(yǔ)句塊中又包含if語(yǔ)句(或if-else語(yǔ)句),下面看一個(gè)實(shí)際的需求:
根據(jù)學(xué)員的成績(jī)來(lái)輸出等級(jí):
此程序即為多路判斷,如圖– 7所示流程圖:

圖- 7
首先判斷分?jǐn)?shù)是否大于等于90,若為真則輸出A終止,為假則再判斷分?jǐn)?shù)是否大于等于80,若為真輸出B終止,為假則再判斷分?jǐn)?shù)是否大于等于60,若為真輸出C終止,為假則輸出D。分析可以看出,該程序經(jīng)過(guò)了3次判斷。需要在else中嵌套判斷。代碼如下所示:
2.4.2. else if語(yǔ)句執(zhí)行邏輯如下圖 – 8所示,在else中再次進(jìn)行if-else的判斷:

圖- 8
從上圖中看出,當(dāng)判斷層數(shù)比較多時(shí),代碼清晰度不夠好,在實(shí)際開發(fā)中常常使用如下圖- 9的方式來(lái)實(shí)現(xiàn),事實(shí)上,else if結(jié)束就是if-else嵌套的簡(jiǎn)便寫法:

圖 – 9
實(shí)現(xiàn)該程序代碼如下所示:
… … ...if(score>=90) { System.out.println("A");} else if (score>=80) { System.out.println("B");} else if(score>=60) { System.out.println("C");} else { System.out.println("D");}通過(guò)上面的代碼可以看出,使用else if方式,程序邏輯更清晰,可讀性更好。
2.5. switch-case語(yǔ)句2.5.1. switch-case語(yǔ)句執(zhí)行邏輯switch-case是一種特殊的分支結(jié)構(gòu),與else if類似,但其應(yīng)用面不如else if,只能用于特殊的情況之下, switch-case可以根據(jù)一個(gè)整數(shù)值的不同取值,從不同的程序入口開始執(zhí)行。語(yǔ)法如下所示:
switch(整型表達(dá)式) { case 整型常量值1: //入口1 語(yǔ)句1; 語(yǔ)句2; case 整型常量值2: //入口2 語(yǔ)句3; …… default: //默認(rèn)入口 語(yǔ)句n; }switch-case流程圖見圖 – 10所示:

圖- 10
分析上圖,可以看出其執(zhí)行邏輯如下:
計(jì)算整型表達(dá)式的值:
通過(guò)分析可以看出,switch是以case后的整型常量值作為入口的,若值相等,即開始執(zhí)行其后面的語(yǔ)句。
使用switch時(shí)需要注意兩個(gè)問(wèn)題,第一,case后面的常量值必須不同,第二,switch后面的整型表達(dá)式的值必須是整型或字符型。
2.5.2. switch-case和break聯(lián)合使用前面的代碼中判斷整型表達(dá)式的值,若其值等于某個(gè)整型常量值,則會(huì)以此作為入口,依次執(zhí)行其后面所有的語(yǔ)句。但是在實(shí)際應(yīng)用中,通常case1、case2、…、caseN對(duì)應(yīng)完全不同的操作,即: 若表達(dá)式的值等于case1,則只執(zhí)行case1后的語(yǔ)句,不會(huì)再執(zhí)行case2、caseN等后面的語(yǔ)句。這種情況下可以和break語(yǔ)句配合使用,執(zhí)行完相應(yīng)語(yǔ)句后即退出switch塊,不繼續(xù)執(zhí)行下面的語(yǔ)句。語(yǔ)法如下所示:
switch(整型表達(dá)式) { case 整型常量值1: //入口1 語(yǔ)句1; 語(yǔ)句2; break ; case 整型常量值2: //入口2 語(yǔ)句3; break ; …… default: //默認(rèn)入口 語(yǔ)句n;}如上程序中的break語(yǔ)句的作用在于跳出switch結(jié)構(gòu),其執(zhí)行邏輯如下:
在實(shí)際應(yīng)用中,switch-case語(yǔ)句常常與break配合使用,參見下面的代碼:
int num = 2;switch(num) { case 1: System.out.println(“呼叫教學(xué)部”); break; case 2: System.out.println(“呼叫人事部”); break; default: System.out.println(“人工服務(wù)”);}上面代碼的輸出結(jié)果為“呼叫人事部“,因?yàn)槠ヅ鋍ase 2輸出后,即break跳出switch語(yǔ)句了。
2.5.4. switch-case的優(yōu)勢(shì)switch-case結(jié)構(gòu)在實(shí)際應(yīng)用中較廣泛, 常常和break語(yǔ)句結(jié)合使用實(shí)現(xiàn)分支的功能。
在很多情況下,switch-case可以代替else if結(jié)構(gòu),而switch-case實(shí)現(xiàn)分支功能的效率要高于else if結(jié)構(gòu),并且結(jié)構(gòu)更清晰,所以推薦使用。從JDK 7.0開始,switch-case可以支持字符串表達(dá)式,將更加方便程序的操作。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注