3.3優(yōu)先級(jí)
最簡(jiǎn)單的規(guī)則就是:先乘除后加減.
3.4賦值和方法調(diào)用別名(引用)
3.5操作運(yùn)算符
一元加,減 和加號(hào)会喝,減號(hào)擁有同樣的符號(hào).編譯器能爭(zhēng)取的識(shí)別.
3.6自加,自減
i++,++i/i--,--i
兩種形式的自加蜻直,減.i的最后值都會(huì)變化.但是在表達(dá)式中的左值是不同的.表達(dá)式中運(yùn)算的左值的順序是這樣的.
i++表示 i先賦值,然后i自身+1, 但是與這個(gè)馬上運(yùn)算的數(shù)是和賦值的先運(yùn)算.
++i 表示涉馅,先自加,然后賦值
以下例子:
private void test() {
int a = 2;
int x = a++ * +a + a;
a = 2;
int y = ++a * +a + a;
System.out.println("x=" + x + " a=" + a);
System.out.println("y=" + y + " a=" + a);
}
//結(jié)果 :
x=9 a=3
y=12 a=3
這里面 a++ * +a + a 先a賦值=2,用這個(gè)值參與運(yùn)算;a再自增截汪,第二個(gè)變量開(kāi)始的a=3了
所以表達(dá)式 等價(jià)與2(+3)+3= 9;
這里的 ++a * +a +a ,a先自加廊遍,用這個(gè)值進(jìn)行參與運(yùn)算,所以一開(kāi)始 a=3,表達(dá)式等價(jià)與 3 (+3)+3 =12;
private void test2() {
int x = 1;
System.out.println("x " + x);
System.out.println("++x " + ++x);
System.out.println("x++ " + x++);
System.out.println("x " + x);
System.out.println("--x " + --x);
System.out.println("x-- " + x--);
System.out.println("x " + x);
}
//out
x 1
++x 2
x++ 2
x 3
--x 2
x-- 2
x 1
3.8.1 短路
在邏輯運(yùn)算符中兢仰,如果前面的表達(dá)式能夠明確無(wú)誤的判斷整個(gè)表達(dá)式的值乍丈,剩余部分的表達(dá)式是不會(huì)執(zhí)行的.這就是短路.
false && XXX ==>false true || XXX==>true
3.9直接常量
八進(jìn)制的數(shù)據(jù): 以0開(kāi)頭,里面的數(shù)字只能在 0-7之間
private void test3() {
System.out.println("x " + 010);
System.out.println("x " + 0170);
}
//--
x 8
x 120
3.10按位運(yùn)算符
^(亦或) xor : 數(shù)學(xué)公式a⊕b = (?a ∧ b) ∨ (a ∧?b) 如果a把将、b兩個(gè)值不相同轻专,則異或結(jié)果為1。如果a察蹲、b兩個(gè)值相同请垛,異或結(jié)果為0
按位操作可以與= 聯(lián)合使用,以便合并運(yùn)算和賦值 ,例如 &= ,|=, ^= 但是 ~ 不能與=合并递览,因?yàn)閪是一元操作.
對(duì)于布爾類型值運(yùn)算叼屠,可以進(jìn)行 & , | , ^ 但是不能進(jìn)行取反(~), 因?yàn)楹汀? 沖突.在布爾類型的的運(yùn)算中瞳腌,中途不會(huì)短路.
private void test4() {
int a = 0x1;
int b = 0x0;
int x = (a | a | a & b);
//這里 可以轉(zhuǎn)化成表達(dá)式 y=(a=(a|(a|a&b))) 所以 y=a
int y = (a |= a | a & b);
boolean booleanA = true;
boolean booleanB = booleanA ^ booleanA;
System.out.println("a" + Integer.toBinaryString(a));
System.out.println("b" + Integer.toBinaryString(b));
System.out.println("x" + Integer.toBinaryString(x));
System.out.println("y" + Integer.toBinaryString(y));
}
//output
a 1
b 0
x 1
y 1
3.11 移位操作
左移(<<) 向左移動(dòng)绞铃,右側(cè)補(bǔ)0
右移(>>) 按照右側(cè)制定的位數(shù),向左側(cè)移動(dòng).符號(hào)位按照”符號(hào)擴(kuò)展”方式:符號(hào)為+嫂侍,如果位數(shù)不夠在高位插0儿捧;若符號(hào)為荚坞,位數(shù)不夠在高位插1.
無(wú)符號(hào)右移(>>>),不管符號(hào)位 是正負(fù)菲盾,位數(shù)不夠都在高位插0
移位可以與= 組合使用(<<= , >>= ,>>>=).但是”無(wú)符號(hào)”右移操作時(shí)颓影,可能會(huì)遇到問(wèn)題,當(dāng)short ,byte 值進(jìn)行以為運(yùn)算懒鉴,得到的可能不是正確的值诡挂,因?yàn)樾枰D(zhuǎn)成int ,在進(jìn)行右移操作,然后被截?cái)嗔倨祝x值給原來(lái)的類型.
3.13 字符串操作 + 和 +=
如果一個(gè)表達(dá)式是 字符串開(kāi)頭璃俗,那么后續(xù)的所有操作數(shù)都必須是字符串,編譯器會(huì)自動(dòng)把雙引號(hào)里面的字符序列自動(dòng)轉(zhuǎn)成字符串.但是對(duì)于字符串前面的數(shù)據(jù)悉默,能夠按正常的運(yùn)算處理城豁,后面的數(shù)據(jù)需要用括號(hào)括起來(lái).
private void testStr() {
int x = 10;
int y = 20;
int z = 30;
System.out.println("字符串后的數(shù)字 " + x + y);
System.out.println("字符串后的數(shù)字 " + (x + y));
System.out.println(x + y + " x+y 字符串前,x+y字符串后 " + x + y);
}