- Java語言程序設計
- 陸遲編著
- 2532字
- 2019-01-09 14:01:50
2.4 運算符
運算符的作用是與一定的運算數據組成表達式來完成相應的運算。對不同的數據類型,有著不同的運算符。對運算符,有運算對象(操作數)個數及類型、運算優先級、結合性等特性。
根據運算對象的多少,Java的運算符可分為一元(或稱單目)、二元(雙目)和三元(三目)運算符。
運算符的優先級是指不同運算符在運算中執行的先后順序。在Java語言中共有17種優先級,每個運算符分屬確定的一個優先級別。Java語言嚴格按照運算符的優先級由高到低地順序執行各種運算。
運算符的結合性確定同級運算符的運算順序。左結合性規定,運算數據先與左邊的運算符結合,然后與右邊的運算符結合。右結合性剛好相反。
本節介紹一些基本的Java運算符。部分未介紹的運算符在以后的章節中陸續介紹。
2.4.1 算術運算符
算術運算符的操作數類型是數值類型。
1.一元算術運算符
表2.6列出了一元算術運算符。它們的結合性是右結合。
表2.6 一元運算符列表

+和-運算符使運算對象取正、負值,用得不多,但它們有提升操作數類型的作用。例如:
byte i=10,j; j = -i;
上述語句將產生編譯錯誤,原因是i經過 - 運算后,已經提升為int類型,直接向字節變量j賦值是不允許的。
++和--既可以是前置運算符也是后置運算符,這就是說,它們既可以放在運算對象(必須是變量)前面(如++ x),也可以放在后面(如x ++)。單獨使用的時候,前置后置作用相同。但若在表達式中使用,前置后置的意義是不同的。前置時,變量的值先增1 或減1,然后用變量的新值參加表達式的計算;后置時,變量的值先參加表達式的計算,然后變量再增1或減1。例如:
設i = 5;
j = i ++;
執行后,j為5,i為6。
而i = 5;
j = ++ i;
執行后,j為6,i為6。
【例2.2】說明++和--運算符的使用。
class IncrementDecrement { public static void main(String args[]) { int i,j,k; i = 1; k=(j=i++); System.out.println("i= "+i+" j="+j+" k= "+k); k=(i=2)*j--; System.out.println("i= "+i+" j="+j+" k= "+k); k=++i+ ++i+ ++i; System.out.println("i= "+i+" j="+j+" k="+k); k=i-- + i-- + i--; System.out.println("i= "+i+" j="+j+" k="+k); } }
程序運行結果如下:
i= 2 j=1 k= 1 i= 2 j=0 k= 2 i= 5 j=0 k=12 i= 2 j=0 k=12
2.二元算術運算符
二元算術運算符不改變運算對象的值,而是得到一個可以保存和輸出的計算結果。表2.7列出了二元算術運算符。二元算術運算符具有左結合性。
表2.7 二元算術運算符

這些都是常用的運算,對二元算術運算符,有兩點要注意:
(1)兩個整數運算的結果是整數,5/2結果是2而不是2.5。
(2)取模運算是求兩個數相除的余數,如17%3 的結果是2??梢詫崝登笥鄶怠崝礱%b的結果為a-(int)(a/b)*b,余數的符號與被除數a相同。如123.4%10的結果為3.4。
2.4.2 關系運算符
關系運算符都是雙目運算符,用于確定一個數據與另一個數據之間的關系,即進行關系運算(比較運算,將兩個值進行比較)。關系運算的結果值為true、false(布爾型)。表2.8列出了Java語言提供的6種關系運算符。
表2.8 關系運算符

在這里要指出的是,等于運算符==不要與賦值運算符=混淆,以致于關系運算變成了賦值運算。
關系運算符常用于if語句、循環語句的條件中。運算符“==”和“!=”的運算優先級低于另外四個關系運算符,同一優先級中遵循自左至右的執行順序。
2.4.3 布爾運算符
布爾運算符可以對布爾類型的數據(布爾常量、布爾變量、關系表達式和布爾表達式等)進行運算,結果也為布爾類型。表2.9 列出了Java語言的布爾運算符,布爾運算規則見表2.10。
表2.9 布爾運算符

表2.10 布爾運算真值表

簡潔與、或和非簡潔與、或的結果有時不同。非簡潔與、非簡潔或運算時,運算符兩邊的表達式都先要運算執行,然后兩表達式的結果再進行與、或運算。簡潔與、簡潔或運算時,若只運算左邊表達式即可確定與、或結果時,則右邊的表達式將不會被計算。
例如,int x = 2,y = 3,a = 4,b = 5;
boolean b = x ++ > y++ && a ++ > b ++;
則運算結果為:b = false, x = 3, y = 4, a = 4, b = 5
而boolean b = x ++ > y++ & a ++ > b ++;
運算結果為:b = false, x = 3, y = 4, a = 5, b = 6
幾個布爾運算符中,單目布爾運算符!的優先級最高,而&又高于|。運算符!又高于算術運算符和關系運算符,運算符&、|低于關系運算符。布爾運算符的執行順序為自左至右。在一個布爾表達式中,使用的運算符種類可能較多,應注意運算符的運算優先級。
【例2.3】布爾運算符的使用。
public class RelationAndConditionOp{ public static void main( String args[] ){ int a = 25,b = 3; boolean d = a < b; // d = false System.out.println("a < b = " + d ); int e = 3; if(e != 0 && a / e > 5)System.out.println( "a / e = " + a / e ); int f = 0; if(f != 0 && a / f > 5) System.out.println("a / f = " + a / f); else System.out.println("f = " + f ); } }
程序運行結果為:
a < b = false a / e = 8 f = 0
熟練地掌握關系運算符和布爾運算符,可以用邏輯表達式描述復雜的條件。
【例2.4】布爾表達式的使用。
(1)用int變量a,b,c表示三個線段的長,它們能構成一個三角形的條件是:任意兩邊之和大于第三邊。該條件的Java布爾表達式為:
(a + b) > c && (b + c) > a && (a + c) > b 或 !((a + b) <= c || (b + c) <= a || (a + c) <= b)
(2)用int變量y,表示年號y是閏年:
y % 400 == 0 | y % 4 == 0 & y % 100 != 0
(3)用int變量age存放年齡,boolean變量sex存放性別(true為男)。表示20歲與25歲之間的女性:
20 <= age & age <= 25 & !sex
2.4.4 位運算符
位運算符用來對二進制位進行運算,運算操作數應是整數類型,結果也是整數類型。Java中提供了表2.11 所示的位運算符。表中前四種稱為位邏輯運算符,后三種稱為移位運算符。
表2.11 位運算符列表

為了理解位運算符的功能,應掌握運算數據的二進制表示形式。Java使用補碼表示二進制數,在補碼表示中,最高位為符號位。正數的符號位用0 表示,其余各位代表數值本身。例如,+1的8位補碼為00000001。負數的符號位用1表示,通常用將負數的絕對值的補碼取反加1的方法來得到負數的補碼。例如,-1的8位補碼為11111111(-1的絕對值的8位補碼00000001按位取反加1為11111110+1=11111111),-42的補碼為11010110 (-42的絕對值的8位補碼00101010按位取反加1為11010101 + 1 = 11010110 )。
若兩個數據長度不同(如short和int型),對它們進行位運算時,則系統首先會將長度短的數據的左側用符號位填滿(稱為符號位擴展)。
1.按位取反運算符(~)
按位取反運算符“~”是一元運算符,對數據的各個二進制位取反,即將0 變為1,1變為0。例如:
int a=0x45 , b; b=~a; // b = 0xba
2.按位與運算符(&)
參與運算的兩個值,如果兩個相應的位都為1,則該位的結果為1,否則為0。例如:
0 & 0 = 0,0 & 1 = 0,1 & 0 = 0,1 & 1 = 1
按位與可以用來把某些特定的位置0(復位),其他位不變。這時只需將要置0 的位同0與,而維持不變的位同1與。例如:
int a = 0x45 , b = 0x31; b = a & b; // b = 1
3.按位或運算符(|)
參與運算的兩個值,如果兩個相應的位都為0,則該位的結果為0,否則為1。即
0 | 0 = 0,0 | 1 = 1,1 | 0 = 1,1 | 1 = 1
按位或可以用來把某些特定的位置1(置位),而不影響其他位。這時只需將要置1 的位同1或,而維持不變的位同0或。例如:
int a = 0x45 , b = 0x31; b = a | b; // b = 0x75
4.按位異或運算符(^)
參與運算的兩個值,如果兩個相應的位相同,則該位的結果為0,否則為1。例如:
0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0
按位異或也稱為按位加,可用于求反某些位。要求求反的位同1 異或,維持不變的位同0異或。這種運算有如下特性:(x^y)^y = x。例如:
int a = 0x45,b = 0x31; b = a ^ b; // b = 0x74
5.左移運算符(<<)
用來將一個數據的所有二進制位全部左移若干位。
在不產生溢出的情況下,數據左移1位相當于乘以2,而且用左移來實現乘法比乘法運算速度要快。例如:
int a = 7 , b; b = a << 1; // b = 14
6.算術右移運算符(>>)
用來將一個數據的所有二進制位全部右移若干位。移出的低位被舍棄,最高位用符號位補入。
右移1位相當于除以2取商,而且用右移來實現除法比除法運算速度要快。例如:
int a = -20 , b; b = a >> 1; // b = -10
但要注意,當移位數據為負且最低位有1 移出時,數據算術右移1 位與數據除以2 的結果不同。例如,-5(0xfb)右移1位等于-3,而(-5)/2的結果是-2。
7.邏輯右移運算符(>>>)
用來將一個數據的所有二進制位全部右移若干位。移出的低位被舍棄,最高位用0 補入。例如:
int a = 0x88 , b; b = a >>> 2; // b = 0x22(34)
2.4.5 賦值運算符
賦值運算符都是二元運算符,具有右結合性。
1.簡單賦值運算符(=)
賦值運算符“=”用來將一個數據賦給一個變量。在賦值運算符兩側的類型不一致的情況下,若左側變量的數據類型的級別高,則右側的數據被轉換為與左側相同的高級數據類型,然后賦給左側變量。否則,需要使用強制類型轉換運算符。
2.復合賦值運算符
Java語言允許使用復合賦值運算符,即在賦值符前加上其他二元運算符。使用復合賦值運算符可簡化表達式的書寫。例如:a += 5等價于a = a + 5。復合賦值運算符有11種,見表2.12所示。
表2.12 復合賦值運算符

復合賦值運算符使用比較簡單,但要注意下述兩點。
(1)復合賦值運算符的右邊是一整體,例如:
a *= b + c;
等價于
a = a * (b + c);
而不是
a = a * b + c;
(2)表2.12中的等價是有條件的:即op1僅計算1次。例如:
設有int a[]={1,2},b=2,i=0; // a是一數組
則a[i++] += b; // 執行后i=1
不等價于a[i++]=a[i++] + b; // 執行后i=2
2.4.6 條件運算符
條件運算符是一種三元運算符,它的格式如下:
布爾表達式 ? 表達式1: 表達式2
在這個式子中,先計算布爾表達式的值,若為真,則計算并返回表達式1,若為假,則計算并返回表達式2。例如:
(a > b) ? a : b
這個表達式將返回a和b中較大的那個數值。
2.4.7 字符串運算符
運算符“+”可以實現兩個或多個字符串的連接,也可實現字符串與其他類對象的連接,在連接時,其他類對象會被轉換成字符串。另外,運算符“+=”把兩個字符串連接的結果放進第一個字符串里,在前面的例子里,當想把幾項輸出內容輸出在同一行里時使用的就是“+”運算符。
- Python概率統計
- Learn to Create WordPress Themes by Building 5 Projects
- Django:Web Development with Python
- Bootstrap Essentials
- Learning Network Forensics
- 執劍而舞:用代碼創作藝術
- 快速入門與進階:Creo 4·0全實例精講
- 代碼閱讀
- Qlik Sense? Cookbook
- Python+Office:輕松實現Python辦公自動化
- Java高級程序設計
- Flink入門與實戰
- Learning D3.js 5 Mapping(Second Edition)
- Jakarta EE Cookbook
- The Applied Data Science Workshop