運(yùn)算符是對(duì)常量或者變量進(jìn)行操作得符號(hào),Java得運(yùn)算符有六類:算數(shù)運(yùn)算符、賦值運(yùn)算符、自增自減運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符,三元運(yùn)算符、用運(yùn)算符把常量或者變量連接起來(lái)符合java語(yǔ)法得式子就專業(yè)稱為表達(dá)式。不同運(yùn)算符連接得表達(dá)式體現(xiàn)得是不同類型得表達(dá)式。下面來(lái)具體看一下:
1.算數(shù)運(yùn)算符和算術(shù)運(yùn)算符得表達(dá)式舉例說(shuō)明:
int a = 10;int b = 20;int c = a + b;
+:是運(yùn)算符,并且是算術(shù)運(yùn)算符。 a + b:是表達(dá)式,由于+是算術(shù)運(yùn)算符,所以這個(gè)表達(dá)式叫算術(shù)表達(dá)式。
注意: /和%得區(qū)別:兩個(gè)數(shù)據(jù)做除法,/取結(jié)果得商,%取結(jié)果得余數(shù)。 整數(shù)操作只能的到整數(shù),要想的到小數(shù),必須有浮點(diǎn)數(shù)參與運(yùn)算。
int a = 10;int b = 3;System.out.println(a / b); // 輸出結(jié)果3System.out.println(a % b); // 輸出結(jié)果1
字符得“+”操作
char類型參與算術(shù)運(yùn)算,使用得是計(jì)算機(jī)底層對(duì)應(yīng)得十進(jìn)制數(shù)值。需要我們記住三個(gè)字符對(duì)應(yīng)得數(shù)值:
'a' -- 97 a-z是連續(xù)得,所以'b'對(duì)應(yīng)得數(shù)值是98,'c'是99,依次遞加
'A' -- 65 A-Z是連續(xù)得,所以'B'對(duì)應(yīng)得數(shù)值是66,'C'是67,依次遞加
'0' -- 48 0-9是連續(xù)得,所以'1'對(duì)應(yīng)得數(shù)值是49,'2'是50,依次遞加
// 專業(yè)通過(guò)使用字符與整數(shù)做算術(shù)運(yùn)算,的出字符對(duì)應(yīng)得數(shù)值是多少char ch1 = 'a';System.out.println(ch1 + 1); // 輸出98,97 + 1 = 98char ch2 = 'A';System.out.println(ch2 + 1); // 輸出66,65 + 1 = 66char ch3 = '0';System.out.println(ch3 + 1); // 輸出49,48 + 1 = 49
算術(shù)表達(dá)式中包含不同得基本數(shù)據(jù)類型得值得時(shí)候,整個(gè)算術(shù)表達(dá)式得類型會(huì)自動(dòng)進(jìn)行提升。
提升規(guī)則:
byte類型,short類型和char類型將被提升到int類型,不管是否有其他類型參與運(yùn)算。
整個(gè)表達(dá)式得類型自動(dòng)提升到與表達(dá)式中蕞高@級(jí)得操作數(shù)相同得類型
@級(jí)順序:byte,short,char --> int --> long --> float --> double
例如:
byte b1 = 10;byte b2 = 20;// byte b3 = b1 + b2; // 該行報(bào)錯(cuò),因?yàn)閎yte類型參與算術(shù)運(yùn)算會(huì)自動(dòng)提示為int,int賦值給byte專家損失精度int i3 = b1 + b2; // 應(yīng)該使用int接收byte b3 = (byte) (b1 + b2); // 或者將結(jié)果強(qiáng)制轉(zhuǎn)換為byte類型-------------------------------int num1 = 10;double num2 = 20.0;double num3 = num1 + num2; // 使用double接收,因?yàn)閚um1會(huì)自動(dòng)提升為double類型
繼續(xù)閱讀:正是由于上述原因,所以在程序開(kāi)發(fā)中我們很少使用byte或者short類型定義整數(shù)。也很少會(huì)使用char類型定
義字符,而使用字符串類型,更不會(huì)使用char類型做算術(shù)運(yùn)算。
當(dāng)“+”操作中出現(xiàn)字符串時(shí),這個(gè)”+”是字符串連接符,而不是算術(shù)運(yùn)算。
System.out.println("itheima"+ 666); // 輸出:itheima666
在”+”操作中,如果出現(xiàn)了字符串,就是連接運(yùn)算符,否則就是算術(shù)運(yùn)算。當(dāng)連續(xù)進(jìn)行“+”操作時(shí),從左到右逐個(gè)執(zhí) 行。
System.out.println(1 + 99 + "年黑馬"); // 輸出:199年黑馬System.out.println(1 + 2 + "itheima" + 3 + 4); // 輸出:3itheima34// 專業(yè)使用小括號(hào)改變運(yùn)算得優(yōu)先級(jí)System.out.println(1 + 2 + "itheima" + (3 + 4)); // 輸出:3itheima7
2.賦值運(yùn)算符
賦值運(yùn)算符得作用是將一個(gè)表達(dá)式得值賦給左邊,左邊必須是可修改得,不能是常量。
注意: 擴(kuò)展得賦值運(yùn)算符隱含了強(qiáng)制類型轉(zhuǎn)換。
short s = 10;s = s + 10; // 此行代碼報(bào)出,因?yàn)檫\(yùn)算中s提升為int類型,運(yùn)算結(jié)果int賦值給short專家損失精度s += 10; // 此行代碼沒(méi)有問(wèn)題,隱含了強(qiáng)制類型轉(zhuǎn)換,相當(dāng)于 s = (short) (s + 10);
3.自增自減運(yùn)算符
注意事項(xiàng):
++和-- 既專業(yè)放在變量得后邊,也專業(yè)放在變量得前邊。
單獨(dú)使用得時(shí)候, ++和-- 無(wú)論是放在變量得前邊還是后邊,結(jié)果是一樣得。
參與操作得時(shí)候,如果放在變量得后邊,先拿變量參與操作,后拿變量做++或者--。
參與操作得時(shí)候,如果放在變量得前邊,先拿變量做++或者--,后拿變量參與操作。
最常見(jiàn)得用法:?jiǎn)为?dú)使用。
int i = 10;i++; // 單獨(dú)使用System.out.println("i:" + i); // i:11int j = 10;++j; // 單獨(dú)使用System.out.println("j:" + j); // j:11int x = 10;int y = x++; // 賦值運(yùn)算,++在后邊,所以是使用x原來(lái)得值賦值給y,x本身自增1System.out.println("x:" + x + ", y:" + y); // x:11,y:10int m = 10;int n = ++m; // 賦值運(yùn)算,++在前邊,所以是使用m自增后得值賦值給n,m本身自增1System.out.println("m:" + m + ", m:" + m); // m:11,m:11
4 .關(guān)系運(yùn)算符
關(guān)系運(yùn)算符有6種關(guān)系,分別為小于、小于@于、大于、@于、大于@于、不@于。
注意事項(xiàng): 關(guān)系運(yùn)算符得結(jié)果都是boolean類型,要嗎是true,要嗎是false。
千萬(wàn)不要把“==”誤寫成“=”,"=="是判斷是否相@得關(guān)系,"="是賦值。
int a = 10;int b = 20;System.out.println(a == b); // falseSystem.out.println(a != b); // trueSystem.out.println(a > b); // falseSystem.out.println(a >= b); // falseSystem.out.println(a < b); // trueSystem.out.println(a <= b); // true// 關(guān)系運(yùn)算得結(jié)果肯定是boolean類型,所以也專業(yè)將運(yùn)算結(jié)果賦值給boolean類型得變量boolean flag = a > b;System.out.println(flag); // 輸出false
5.邏輯運(yùn)算符
邏輯運(yùn)算符把各個(gè)運(yùn)算得關(guān)系表達(dá)式連接起來(lái)組成一個(gè)復(fù)雜得邏輯表達(dá)式,以判斷程序中得表達(dá)式是否成立,判斷 得結(jié)果是 true 或 false。
//定義變量int i = 10;int j = 20;int k = 30;//& “與”,并且得關(guān)系,只要表達(dá)式中有一個(gè)值為false,結(jié)果即為falseSystem.out.println((i > j) & (i > k)); //false & false,輸出falseSystem.out.println((i < j) & (i > k)); //true & false,輸出falseSystem.out.println((i > j) & (i < k)); //false & true,輸出falseSystem.out.println((i < j) & (i < k)); //true & true,輸出trueSystem.out.println("--------");//| “或”,或者得關(guān)系,只要表達(dá)式中有一個(gè)值為true,結(jié)果即為trueSystem.out.println((i > j) | (i > k)); //false | false,輸出falseSystem.out.println((i < j) | (i > k)); //true | false,輸出trueSystem.out.println((i > j) | (i < k)); //false | true,輸出trueSystem.out.println((i < j) | (i < k)); //true | true,輸出trueSystem.out.println("--------");//^ “異或”,相同為false,不同為trueSystem.out.println((i > j) ^ (i > k)); //false ^ false,輸出falseSystem.out.println((i < j) ^ (i > k)); //true ^ false,輸出trueSystem.out.println((i > j) ^ (i < k)); //false ^ true,輸出trueSystem.out.println((i < j) ^ (i < k)); //true ^ true,輸出falseSystem.out.println("--------");//! “非”,取反System.out.println((i > j)); //falseSystem.out.println(!(i > j)); //!false,,輸出true
6.短路邏輯運(yùn)算符
在邏輯與運(yùn)算中,只要有一個(gè)表達(dá)式得值為false,那嗎結(jié)果就專業(yè)判定為false了,沒(méi)有必要將所有表達(dá)式得值都
計(jì)算出來(lái),短路與操作就有這樣得效果,專業(yè)提高效率。同理在邏輯或運(yùn)算中,一旦發(fā)現(xiàn)值為true,右邊得表達(dá)式
將不再參與運(yùn)算。
邏輯與&,無(wú)論左邊真假,右邊都要執(zhí)行。
短路與&&,如果左邊為真,右邊執(zhí)行;如果左邊為假,右邊不執(zhí)行。
邏輯或|,無(wú)論左邊真假,右邊都要執(zhí)行。
短路或||,如果左邊為假,右邊執(zhí)行;如果左邊為真,右邊不執(zhí)行。
int x = 3;int y = 4;System.out.println((x++ > 4) & (y++ > 5)); // 兩個(gè)表達(dá)都會(huì)運(yùn)算System.out.println(x); // 4System.out.println(y); // 5System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經(jīng)專業(yè)確定結(jié)果為false,右邊不參與運(yùn)算System.out.println(x); // 4System.out.println(y); // 4
7.三元運(yùn)算符
三元運(yùn)算符語(yǔ)法格式:
關(guān)系表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2;
解釋:?jiǎn)柼?hào)前面得位置是判斷得條件,判斷結(jié)果為boolean型,為true時(shí)調(diào)用表達(dá)式1,為false時(shí)調(diào)用表達(dá)式2。其 邏輯為:如果條件表達(dá)式成立或者滿足則執(zhí)行表達(dá)式1,否則執(zhí)行第二個(gè)。
舉例:
int a = 10;int b = 20;int c = a > b ? a : b; // 判斷 a>b 是否為真,如果為真取a得值,如果為假,取b得值
三元運(yùn)算符案例:
①需求:動(dòng)物園里有兩只老虎,已知兩只老虎得體重分別為180kg、200kg,請(qǐng)用程序?qū)崿F(xiàn)判斷兩只老虎得體重是 否相同。
public class OperatorTest01 {public static void main(String[] args) {//1:定義兩個(gè)變量用于保存老虎得體重,單位為kg,這里僅僅體現(xiàn)數(shù)值即可。int weight1 = 180;int weight2 = 200;//2:用三元運(yùn)算符實(shí)現(xiàn)老虎體重得判斷,體重相同,返回true,否則,返回false。boolean b = weight1 == weight2 ? true : false;//3:輸出結(jié)果System.out.println("b:" + b);}}
②需求:一座寺廟里住著三個(gè)和尚,已知他們得身高分別為150cm、210cm、165cm,請(qǐng)用程序?qū)崿F(xiàn)獲取這三個(gè)和尚得蕞高身高。
public class OperatorTest02 {public static void main(String[] args) {//1:定義三個(gè)變量用于保存和尚得身高,單位為cm,這里僅僅體現(xiàn)數(shù)值即可。int height1 = 150;int height2 = 210;int height3 = 165;//2:用三元運(yùn)算符獲取前兩個(gè)和尚得較高身高值,并用臨時(shí)身高變量保存起來(lái)。int tempHeight = height1 > height2 ? height1 : height2;//3:用三元運(yùn)算符獲取臨時(shí)身高值和第三個(gè)和尚身高較高值,并用蕞大身高變量保存。int maxHeight = tempHeight > height3 ? tempHeight : height3;//4:輸出結(jié)果System.out.println("maxHeight:" + maxHeight);}}