Java運算符
算術運算符
Java支持所有基本的算術運算符:加,減,乘,除,求餘,自加,自減等;
- 加法運算符(也可做字符串連接運算符):+
double a = 5.2;
double b = 4.0;
//sum 的值爲 9.2
double sum = a + b;
//字符串拼接
String str = "aaaa" + "bbbb";
- 減法運算符(也可做求負運算):-
double a = 5.2;
double b = 4.0;
//sub 的值爲 1.2
double sub = a - b;
double c = -5.2;
- 乘法運算符:*
double a = 5.2;
double b = 3.1;
//multiply 的值爲16.12
double multiply = a * b;
- 除法運算符:/
如果除法的兩個操作數都是整數類型,則計算結果也是整數,就是將自然除法的結果截斷取整,如19/4的值爲4而不是5;除數不能爲0,否則會拋出異常;
如果除法的兩個操作數有一個是浮點數,或者兩個都是浮點數,則計算結果也是浮點數,允許除數是0或0.0,得到的結果將是正無窮或負無窮;
double a = 5.3;
double b = 3.1;
//div的值爲1.6774193548387097
double div = a / b;
//div2爲正無窮大
double div2 = 5 / 0.0;
//div3爲負無窮大
double div3 = -5 / 0.0;
//拋出java.lang.ArithmeticException異常
double div4 = 5 / 0;
- 求餘:%
求餘的結果不一定是整數,由於需要經過除法運算,所以必需滿足除法的運算規則;當兩個數都爲整數類型時,第二個數不能爲0,否則會拋出異常;
當兩個數中有一個浮點數時,第二個操作數據可爲0或0.0,只不過結果爲非數:NaN;0或0.0對零以外的任何數求餘都是0或0.0;
double a = 5.2;
double b = 3.1;
//mod 的值爲2.1;
double mod = a % b;
//mod1 的結果爲NaN
double mod1 = 5 % 0.0;
//mod2 的結果爲NaN
double mod2 = -5 % 0.0;
//mod3 的結果爲0.0;
double mod3 = 0 % 5.0;
//mod4 的結果爲NaN
double mod4 = 0 % 0.0;
//拋出java.lang.ArithmeticException
double mod5 = 5 % 0;
- 自加:++
自加是單目運算符,只能操作一個操作數;自加運算符只能操作單個數值型(整形、浮點型都行)的變量,不能操作常量或表達式;運算符可出現在操作數的左邊也可出現在操作數的右邊;++出現在操作數的左邊是先自加(加1)再把自加後的結果放入表達式中運算;++出現在操作數的右邊是先把操作數放入表達式運算後再自加;
int a = 5;
//b 的結果爲11,a爲6
int b = ++a + 5;
a = 5;
//c 的結果爲10,a爲6;
int c = a++ + 5;
//以下寫法是錯誤的
5++;
++5;
- 自減:- -
自減也是單目運算符,只能操作一個操作數;自減運算符只能操作單個數值型(整形、浮點型都行)的變量,不能操作常量或表達式;運算符可出現在操作數的左邊也可出現在操作數的右邊;–出現在操作數的左邊是先自減(減1)再把自減後的結果放入表達式中運算;–出現在操作數的右邊是先把操作數放入表達式運算後再自減;
int a = 5;
//b 的結果爲9,a爲4
int b = --a + 5;
a = 5;
//c 的結果爲10,a爲4;
int c = a-- + 5;
//以下寫法是錯誤的
5--;
--5;
賦值運算符
賦值運算符用於誒變量指定變量值;因爲賦值運算符是有值的,值就是賦值運算符右邊的值,所以支持連續賦值(但不推薦使用,降低了代碼的可讀性);
String str = "aaa";
int a = 5;
String str2 = str;
double sum = a + 5.0;
int b;
int c;
int d;
b = c = d = 7;//不推薦使用
賦值運算符可與算數運算符、位移運算符結合;
- +=;對應於x += y;即x = x + y;
- -=;對應於x -= y;即x = x - y;
- *=;對應於x = y;即x = x y;
- /=;對應於x /= y;即x = x / y;
- %=;對應於x %= y;即x = x % y;
- &=;對應於x &= y;即x = x & y;
- |=;對應於x |= y;即x = x | y;
- ^=;對應於x ^= y;即x = x ^ y;
- <<=;對應於x <<= y;即x = x << y;
- >>=;對應於x >>= y;即x = x >> y;
- >>>=;對應於x >>>= y;即x = x >>> y;
比較運算符
比較運算符用於比較兩個常量或變量的大小,比較結果是一個布爾值;
- > 大於,只支持左右兩邊操作數都是數值類型。如果前面的操作數大於後面的操作數則返回true;
- >= 大於等於,只支持左右兩邊操作數都是數值類型。如果前面的操作數大於等於後面的操作數則返回true;
- < 小於,只支持左右兩邊操作數都是數值類型。如果前面的操作數小於後面的操作數則返回true;
- <= 小於等於,只支持左右兩邊操作數都是數值類型。如果前面的操作數小於等於後面的操作數則返回true;
- == 等於,如果進行比較的兩個操作數都是數值類型,即使他們的類型不同,只要值相等,也都返回true;如果兩個操作數都是引用類型,那麼只有當兩個引用變量的類型具有父子關係時纔可以進行比較,而且兩個引用必須指向同一個對象纔會返回true;同時也支持兩個boolean類型的比較;基本類型的變量、值不能和引用類型的變量和值使用==進行比較;boolean類型的變量、值不能與其他類型的變量、值使用==進行比較;如果兩個引用類型的之間沒有父子繼承關係,也不能使用==進行比較;
- != 不等於,如果進行比較的兩個操作數都是數值類型,無論他們的類型是否相同,只要值不同,也都返回true;如果兩個操作數都是引用類型,那麼只有當兩個引用變量的類型具有父子關係時纔可以進行比較,只有當兩個引用必須指向不同對象纔會返回true;同時也支持兩個boolean類型的比較;基本類型的變量、值不能和引用類型的變量和值使用!=進行比較;boolean類型的變量、值不能與其他類型的變量、值使用!=進行比較;如果兩個引用類型的之間沒有父子繼承關係,也不能使用!=進行比較;
int a = 5;
double b = 4.0;
char c = 'a';
//b1 true
boolean b1 = a > b;
//b2 true
boolean b2 = b == 5.0;
//b3 true
boolean b3 = 97 == c;
/b4 false
boolean b4 = true == false;
//Test 爲一個類,這裏沒有定義
Test test1 = new Test();
Test test2 = new Test();
Test test3 = test1;
//b5 false test1,test2 指向不同對象
boolean b5 = test1 == test2;
//b6 true test1,test3 指向同一個對象
boolean b6 = test1 == test3;
邏輯運算符
用於操作兩個布爾型的變量或常量;
- && 與,前後兩個操作數必須都是true纔會返回true;先計算左邊的的操作數,如果左邊的操作數爲false則返回false,如果爲true才計算右邊的操作數;
- & 不短路與,作用與&&相同,但不會短路;不管左邊的操作數是true還是false,都會計算右邊的數;
- || 或,只要兩個操作數有一個爲true就返回true;先計算左邊的的操作數,如果左邊的操作數爲true則返回true,如果爲false才計算右邊的操作數;
- | 不短路或,作用與||相同,但不短路;不管左邊的操作數是true還是false,都會計算右邊的數;
- !非,只需要一個操作數,如果操作數爲true則返回false,操作數爲false則返回true;
- ^ 異或,當兩個操作數不同時才返回true;
boolean a = true;
boolean b = false;
//c false
boolean c = !a;
//d true
boolean d = a ^ b;
//f true 5 >3 ture, 'a' > 10 true
boolean f = 5 > 3 && 'a' > 10;
//g false 5 < 3 false,不會進行'a' > 10的判斷
boolean g = 5 < 3 && 'a' > 10;
//h false 5 < 3 false,會進行'a' > 10的判斷
boolean h = 5 < 3 & 'a' > 10;
//i true 5 > 3 true 不會進行'a' > 10的判斷
boolean i = 5 > 3 || 'a' > 10;
//j true 5 > 3 true,會進行'a' > 10的判斷
boolean j = 5 > 3 | 'a' > 10;
位運算符
- 按位與(當兩位同時爲1時才返回1):&
int a = 5;
int b = 9;
//c 的值位1
int c = a & b;
5的二進制碼爲00000101(前面省略24個0),9的二進制碼爲00001001(前面省略24個0)
00000101(5)
00001001(9)
--------- &
00000001(結果1)
- 按位或(只要有一位爲1時就返回1):|
int a = 5;
int b = 9;
//c 的值位13
int c = a | b;
5的二進制碼爲00000101(前面省略24個0),9的二進制碼爲00001001(前面省略24個0)
00000101(5)
00001001(9)
--------- |
00001101(結果13)
- 按位非(單目運算符,將操作數的每一位(包括符號位)全部取反:~
int a = -5;
//b 的值爲4
int b = ~a;
-5 的原碼爲10000000000000000000000000000101;(計算機存儲的爲補碼)
-5 的反碼爲11111111111111111111111111111010;(符號位不變,其餘各位反碼)
-5 的補碼爲11111111111111111111111111111011;(反碼加1)
-5 按位非爲00000000000000000000000000000100;(正數的補碼和原碼相同,所以爲結果4)
- 按位異或(當兩位相同時返回0,不同時返回1): ^
int a = 5;
int b = 9;
//c 的值位12
int c = a ^ b;
5的二進制碼爲00000101(前面省略24個0),9的二進制碼爲00001001(前面省略24個0)
00000101(5)
00001001(9)
--------- ^
00001100(結果12)
- 左移運算符:<<
左移運算符是將操作符的二進制碼整體左移指定位數,左移空出來的位以0填充
int a = 5;
//b 的值爲20
int b = 5 << 2;
5的二進制碼爲00000101(前面省略24個0),左移2位爲00010100,結果爲20;
int c = -5;
//d 的結果爲-20
int d = -5 << 2;
-5的二進制碼爲11111011(前面省略24個1),左移2位爲11101100,結果爲-20;
- 右移運算符:>>
右移運算符是將操作數的二進制碼整體右移指定的位數,右移空出來的位以原來的符號爲填充;
int a = 5;
//b 的值爲1
int b = a >> 2;
5的二進制碼爲00000101(前面省略24個0),右移2位爲00000001,結果爲1;
int c = -5;
int d = c >> 2;
-5的二進制碼爲11111011(前面省略24個1),右移2位爲11111110,結果爲-2;
- 無符號右移運算符:>>>
無符號右移運算符是將操作數的二進制碼整體右移指定的位數,右移空出來的位總是補0;
int a = -5;
//b 的值爲1073741822
int b = a >>> 2;
-5的二進制碼爲11111011(前面省略24個1),無符號右移2位爲00111111 11111111 11111111 11111110,結果爲1073741822;
一般來說,位運算符只能操作整數類型的變量或值:
第一個操作數 | 第二個操作數 | 按位與(&) | 按位或(|) | 按位異或(^) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
- 對於低於int 類型(如byte,short,char)的操作數總是先自動轉換爲int類型後再移位;
- 對於int類型,a>>b,當b>32時,系統總是先用b對32求餘(因爲int只有32位),得到的結果纔是真正移位的位數;
- 對於long類型整數移位a>>b,當b>64時,系統總是先用b對64求餘(因爲long只有64位),得到的結果纔是真正移位的位數;
- 進行移位運算不會改變操作數本身,只是得到一個新的運算結果,原先的操作數結果不變;
三目運算符
- ?:(expression)?if-true-statement:if-false-statement;
先對邏輯表達式expression求值,如果邏輯表達式返回true,則返回第二操作數的值,如果爲false則返回第三個操作數的值;
//str 爲5大於3
String str = 5 > 3 ? "5大於3" : "5小於3";