運算符
運算符豐富是 Java 語言的主要特點之一,它提供的運算符數量之多,在高級語言中是少見的。
Java 語言中的運算符除了具有優先級之外,還有一個結合性的特點。當一個表達式中出現多種運算符時,執行的先后順序不僅要遵守運算符優先級別的規定,還要受運算符結合性的約束,以便確定是自左向右進行運算還是自右向左進行運算。這些運算符按照操作數的數量可以分為單目運算符、雙目運算符和三目運算符。
最基本的運算符包括算術運算符、賦值運算符、邏輯運算符和關系運算符等
算術運算符
一元運算符(含自增自減內容)
算術一元運算一共有 3 個,分別是 -、++ 和 --。
| 運 算 符 | 名 稱 | 說 明 | 例 子 |
|---|---|---|---|
| - | 取反符號 | 取反運算 | b=-a |
| ++ | 自加一 | 先取值再加一,或先加一再取值 | a++ 或 ++a |
| -- | 自減一 | 先取值再減一,或先減一再取值 | a-- 或 --a |
表中,-a 是對 a 取反運算,a++ 或 a-- 是在表達式運算完后,再給 a 加一或減一。而 ++a 或 --a 是先給 a 加一或減一,然后再進行表達式運算。
| 運算符 | 含義 | 實例 | 結果 |
|---|---|---|---|
| i++ | 將 i 的值先使用再加 1 賦值給 i 變量本身 | int i=1; int j=i++; | i=2 j=1 |
| ++i | 將 i 的值先加 1 賦值給變量 i 本身后再使用 | int i=1; int j=++i; | i=2 j=2 |
| i-- | 將 i 的值先使用再減 1 賦值給變量 i 本身 | int i=1; int j=i--; | i=0 j=1 |
| --i | 將 i 的值先減 1 后賦值給變量 i 本身再使用 | int i=1; int j=--i; | i=0 j=0 |
在使用自增/自減運算時應注意下面幾個問題。
-
自增/自減只能作用於變量,不允許對常量、表達式或其他類型的變量進行操作。常見的錯誤是試圖將自增或自減運算符用於非簡單變量表達式中。
-
自增/自減運算可以用於整數類型 byte、short、int、long,浮點類型 float、double,以及字符串類型 char。
-
在 Java 1.5 以上版本中,自增/自減運算可以用於基本類型對應的包裝器類 Byte、Short、Integer、Long、Float、Double 和 Character。
-
自增/自減運算結果的類型與被運算的變量類型相同。
‘自增自減’
int x = 5, y; // 聲明用於自增和自減的整型變量 char cx = 'B', cy; // 聲明用於自增和自減的字符型變量 float fx = 5.5f, fy; // 聲明用於自增和自減的浮點型變量 System.out.println("---------對整數的自增和自減---------"); y = x++; System.out.printf("y=x++ 的結果為:%d ,%d \n", x, y); y = x--; System.out.printf("y=x-- 的結果為:%d ,%d \n", x, y); y = ++x; System.out.printf("y=++x 的結果為:%d ,%d \n", x, y); y = --x; System.out.printf("y=--x 的結果為:%d ,%d \n", x, y); System.out.println("\n---------對浮點的自增和自減---------"); fy = fx++; System.out.printf("fy=fx++ 的結果為:%f ,%f \n", fx, fy); fy = fx--; System.out.printf("fy=fx-- 的結果為:%f ,%f \n", fx, fy); fy = ++fx; System.out.printf("fy=++fx 的結果為:%f ,%f \n", fx, fy); fy = --fx; System.out.printf("fy=--fx 的結果為:%f ,%f \n", fx, fy); System.out.println("\n---------對字符的自增和自減---------"); cy = cx++; System.out.printf("cy=cx++ 的結果為:%c ,%c \n", cx, cy); cy = cx--; System.out.printf("cy=cx-- 的結果為:%c ,%c \n", cx, cy); cy = ++cx; System.out.printf("cy=++cx 的結果為:%c ,%c \n", cx, cy); cy = --cx; System.out.printf("cy=--cx 的結果為:%c ,%c \n", cx, cy);
---------對整數的自增和自減---------
y=x++ 的結果為:6 ,5
y=x-- 的結果為:5 ,6
y=++x 的結果為:6 ,6
y=--x 的結果為:5 ,5
---------對浮點的自增和自減---------
fy=fx++ 的結果為:6.500000 ,5.500000
fy=fx-- 的結果為:5.500000 ,6.500000
fy=++fx 的結果為:6.500000 ,6.500000
fy=--fx 的結果為:5.500000 ,5.500000
---------對字符的自增和自減---------
cy=cx++ 的結果為:C ,B
cy=cx-- 的結果為:B ,C
cy=++cx 的結果為:C ,C
cy=--cx 的結果為:B ,B
二元運算符
Java 語言中算術運算符的功能是進行算術運算,除了經常使用的加(+)、減(-)、乘()和除(\)外,還有取模運算(%)。加(+)、減(-)、乘()、除(\)和我們平常接觸的數學運算具有相同的含義。
| 運 算 符 | 名 稱 | 說 明 | 例 子 |
|---|---|---|---|
| + | 加 | 求 a 加 b 的和,還可用於 String 類型,進行字符串連接操作 | a + b |
| - | 減 | 求 a 減 b 的差 | a - b |
| * | 乘 | 求 a 乘以 b 的積 | a * b |
| / | 除 | 求 a 除以 b 的商 | a / b |
| % | 取余 | 求 a 除以 b 的余數 | a % b |
算術運算符都是雙目運算符,即連接兩個操作數的運算符。優先級上,*、/、% 具有相同運算級別,並高於 +、-(+、- 具有相同級別)。
‘四種類型的二元運算’
float f1 = 9 % 4;// 保存取余后浮點類型的結果
double da = 9 + 4.5; // 雙精度加法
double db = 9 - 3.0; // 雙精度減法
double dc = 9 * 2.5; // 雙精度乘法
double dd = 9 / 3.0; // 雙精度除法
double de = 9 % 4; // 雙精度取余
System.out.println("整數的算術運算"); // 整數的加、減、乘、除和取余
System.out.printf("9+4=%d \n", 9 + 4);
System.out.printf("9-4=%d \n", 9 - 4);
System.out.printf("9*4=%d \n", 9 * 4);
System.out.printf("9/4=%d \n", 9 / 4);
System.out.printf("9%%4=%d \n", 9 % 4);
System.out.println("\n浮點數的算術運算"); // 浮點數的加、減、乘、除和取余
System.out.printf("9+4.5f=%f \n", 9 + 4.5f);
System.out.printf("9-3.0f=%f \n", 9 - 3.0f);
System.out.printf("9*2.5f=%f \n", 9 * 2.5f);
System.out.printf("9/3.0f=%f \n", 9 / 3.0f);
System.out.printf("9%%4=%f \n", f1);
System.out.println("\n雙精度數的算術運算"); // 雙精度數的加、減、乘、除和取余
System.out.printf("9+4.5=%4.16f \n", da);
System.out.printf("9-3.0=%4.16f \n", db);
System.out.printf("9*2.5=%4.16f \n", dc);
System.out.printf("9/3.0=%4.16f \n", dd);
System.out.printf("9%%4=%4.16f \n", de);
System.out.println("\n字符的算術運算"); // 對字符的加法和減法
System.out.printf("'A'+32=%d \n", 'A' + 32);
System.out.printf("'A'+32=%c \n", 'A' + 32);
System.out.printf("'a'-'B'=%d \n", 'a' - 'B');
整數的算術運算
9+4=13
9-4=5
9*4=36
9/4=2
9%4=1
浮點數的算術運算
9+4.5f=13.500000
9-3.0f=6.000000
9*2.5f=22.500000
9/3.0f=3.000000
9%4=1.000000
雙精度數的算術運算
9+4.5=13.5000000000000000
9-3.0=6.0000000000000000
9*2.5=22.5000000000000000
9/3.0=3.0000000000000000
9%4=1.0000000000000000
字符的算術運算
'A'+32=97
'A'+32=a
'a'-'B'=31
本示例中使用了 4 種類型來執行算術運算。其中,整數類型的結果最容易理解,浮點型和雙精度型返回的結果都帶有小數,字符型將會把字符轉換為 ASCII 碼再運算。
從輸出結果中可以看到,整數之間的運算結果只保留整數部分,浮點型運算時保留 6 位小數部分,雙精度運算時則保留 16 位小數部分。
注意:Java 語言算術運算符的優先級是先乘除后加減
算術賦值運算符
算術賦值運算符只是一種簡寫,一般用於變量自身的變化。
| 運 算 符 | 名 稱 | 例 子 |
|---|---|---|
| += | 加賦值 | a += b、a += b+3 |
| -= | 減賦值 | a -= b |
| *= | 乘賦值 | a *= b |
| /= | 除賦值 | a /= b |
| %= | 取余賦值 | a %= b |
‘示例’
int a = 1;
int b = 2;
a += b; // 相當於 a = a + b
System.out.println(a); // 3
a += b + 3; // 相當於 a = a + b + 3
System.out.println(a); // 8
a -= b; // 相當於 a = a - b
System.out.println(a); // 6
a *= b; // 相當於 a=a*b
System.out.println(a); // 12
a /= b; // 相當於 a=a/b
System.out.println(a); // 6
a %= b; // 相當於 a=a%b
System.out.println(a); // 0
賦值運算符
賦值運算符是指為變量或常量指定數值的符號。賦值運算符的符號為“=”,它是雙目運算符,左邊的操作數必須是變量,不能是常量或表達式。
格式:
變量名稱 = 表達式內容
其中,變量名稱”和“表達式”內容的類型必須匹配,如果類型不匹配則需要自動轉化為對應的類型。
賦值運算符和算數運算符也可以組成復合賦值運算,如下表所示:
| 運算符 | 含義 | 實例 | 結果 |
|---|---|---|---|
| += | 將該運算符左邊的數值加上右邊的數值, 其結果賦值給左邊變量本身 | int a=5; a+=2; | a=7 |
| -= | 將該運算符左邊的數值減去右邊的數值, 其結果賦值給左邊變量本身 | int a=5; a-=2; | a=3 |
| *= | 將該運算符左邊的數值乘以右邊的數值, 其結果賦值給左邊變量本身 | int a=5; a*=2; | a=10 |
| /= | 將該運算符左邊的數值整除右邊的數值, 其結果賦值給左邊變量本身 | int a=5; a/=2; | a=2 |
| %= | 將該運算符左邊的數值除以右邊的數值后取余,其結果賦值給左邊變量本身 | int a=5; a%=2; | a=1 |
‘賦值運算表達式’
int x, y, z; // 定義3個整型的變量
x = y = z = 6; // 為變量賦初值為6
x += 10; // 等價於x=x+10,結果x=16
y -= 3; // 等價於y=y-3,結果y=3
z *= 5; // 等價於z=z*5,結果z=30
x /= 4; // 等價於x=x/4,結果x=4
z %= x; // 等價於z=z%x,結果z=2
注意:雖然 Java 支持一次為多個變量賦值的寫法,但這種寫導致程序的可讀性降低,因此不推薦。
邏輯運算符
邏輯運算符把各個運算的關系表達式連接起來組成一個復雜的邏輯表達式,以判斷程序中的表達式是否成立,判斷的結果是 true 或 false。邏輯運算符是對布爾型變量進行運算,其結果也是布爾型。
邏輯運算符的含義及用法:
| 運算符 | 用法 | 含義 | 說明 | 實例 | 結果 |
|---|---|---|---|---|---|
| && | a&&b | 短路與 | ab 全為 true 時,計算結果為 true,否則為 false。 | 2>1&&3<4 | true |
| || | a||b | 短路或 | ab 全為 false 時,計算結果為 false,否則為 true。 | 2<1||3>4 | false |
| ! | !a | 邏輯非 | a 為 true 時,值為 false,a 為 false 時,值為 true | !(2>4) | true |
| | | a|b | 邏輯或 | ab 全為 false 時,計算結果為 false,否則為 true | 1>2|3>5 | false |
| & | a&b | 邏輯與 | ab 全為 true 時,計算結果為 true,否則為 false | 1<2&3<5 | true |
- &&還具有短路的功能,即如果第一個表達式為false,則不再計算第二個表達式
- &還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0×31 & 0x0f的結果為0×01。
- ||只要滿足第一個條件,后面的條件就不再判斷,而|要對所有的條件進行判斷。也就是說:“|”不存在短路
注意:短路與(&&)和短路或(||)能夠采用最優化的計算方式,從而提高效率。在實際編程時,應該優先考慮使用短路與和短路或。
邏輯運算符的優先級為:!運算級別最高,&& 運算高於 || 運算。!運算符的優先級高於算術運算符,而 && 和 || 運算則低於關系運算符。結合方向是:邏輯非(單目運算符)具有右結合性,邏輯與和邏輯或(雙目運算符)具有左結合性。
關系運算符
關系運算符(relational operators)也可以稱為“比較運算符”,用於用來比較判斷兩個變量或常量的大小。關系運算符是二元運算符,運算結果是 boolean 型。當運算符對應的關系成立時,運算結果是 true,否則是 false。
關系運算符及其含義說明:
| 運算符 | 含義 | 說明 | 實例 | 結果 |
|---|---|---|---|---|
| > | 大於運算符 | 只支持左右兩邊操作數是數值類型。如果前面變量的值大於后面變量的值, 則返回 true。 | 2>3 | false |
| >= | 大於或等於運算符 | 只支持左右兩邊操作數是數值類型。如果前面變量的值大於等於后面變量的值, 則返回 true。 | 4>=2 | true |
| < | 小於運算符 | 只支持左右兩邊操作數是數值類型。如果前面變量的值小於后面變量的值,則返回 true。 | 2<3 | true |
| <= | 小於或等於運算符 | 只支持左右兩邊操作數是數值類型。如果前面變量的值小於等於后面變量的值, 則返回 true。 | 4<=2 | false |
| == | 相等運算符 | 如果進行比較的兩個操作數都是數值類型,無論它們的數據類型是否相同,只要它們的值相等,也都將返回 true。 如果兩個操作數都是引用類型,只有當兩個引用變量的類型具有父子關系時才可以比較,只要兩個引用指向的不是同一個對象就會返回 true。 Java 也支持兩個 boolean 類型的值進行比較。 | 4 == 4;97 == 'a';5.0 == 5;true==false | true true true false |
| != | 不相等運算符 | 如果進行比較的兩個操作數都是數值類型,無論它們的數據類型是否相同,只要它們的值不相等,也都將返回 true。 如果兩個操作數都是引用類型,只有當兩個引用變量的類型具有父子關系時才可以比較,只要兩個引用指向的不是同一個對象就會返回 true。 | 4!=2 | true |
注意:
- 基本類型的變量、值不能和引用類型的變量、值使用 == 進行比較;boolean 類型的變量、值不能與其他任意類型的變量、值使用 == 進行比較;如果兩個引用類型之間沒有父子繼承關系,那么它們的變量也不能使用 == 進行比較。
- == 和 != 可以應用於基本數據類型和引用類型。當用於引用類型比較時,比較的是兩個引用是否指向同一個對象,但當時實際開發過程多數情況下,只是比較對象的內容是否相當,不需要比較是否為同一個對象。
關系運算符的優先級為:>、<、>=、<= 具有相同的優先級,並且高於具有相同優先級的 !=、==。關系運算符的優先級高於賦值運算符而低於算術運算符,結合方向是自左向右。
位運算符
Java 定義的位運算(bitwise operators)直接對整數類型的位進行操作,這些整數類型包括 long,int,short,char 和 byte。
位運算符主要用來對操作數二進制的位進行運算。按位運算表示按每個二進制位(bit)進行計算,其操作數和運算結果都是整型值。
Java 語言中的位運算符分為位邏輯運算符和位移運算符兩類。
位邏輯運算符
位邏輯運算符包含 4 個:&(與)、|(或)、~(非)和 ^(異或)。除了 ~(即位取反)為單目運算符外,其余都為雙目運算符。
按位與運算
按位與運算符"&"是雙目運算符。 其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為11111111)。
‘Java位與運算’
int a=9,b=5,c;
c=a&b;
System.out.printf("a=%d\nb=%d\nc=%d\n",a,b,c);
// a=9
// b=5
// c=1
按位或運算
按位或運算符“|”是雙目運算符。 其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
9|5
00001001
|
00000101
=00001101
00001101十進制為13,所以9|5 = 13.
‘’
int a=9,b=5,c;
c=a|b;
System.out.printf("a=%d\nb=%d\nc=%d\n",a,b,c); // c = 13
按位異或運算
按位異或運算符“^”是雙目運算符。 其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現。
'9^5'
00001001
^
00000101
=00001100
求反運算
求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。
如:
~000110
=111001
注意:位運算符的操作數只能是整型或者字符型數據以及它們的變體,不用於 float、double 或者 long 等復雜的數據類型。
位移運算符
左移運算符
左移運算符,是雙目運算符。左移n位就是乘以2的n次方。 其功能把左邊的運算數的各二進位全部左移若干位,由右邊的數指定移動的位數,高位丟棄,低位補0。
(丟棄最高位,0補最低位)
1.例: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位后為00110000(十進制48)。
2.例: int i = 1; i = i << 2; //把i里的值左移2位 也就是說,1的2進制是000...0001(這里1前面0的個數和int的位數有關,32位機器,gcc里有31個0),左移2位之后變成 000...0100,也就是10進制的4,所以說左移1位相當於乘以2,那么左移n位就是乘以2的n次方了
右移運算符
右移運算符,是雙目運算符。右移n位就是除以2的n次方
其功能是把左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把00001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。
右移對符號位的處理和左移不同: 對於有符號整數來說,比如int類型,右移會保持符號位不變。
‘示例’
x>>1;//相當於x/=2
x<<1;//相當於x*=2
x>>2;//x/=4
x<<2;//x*=4
x>>3;//x/=8
x<<3;//x*=8
所有運算符的優先級

