Java運算符

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 = 50.0//div3爲負無窮大
double div3 = -50.0//拋出java.lang.ArithmeticException異常
double div4 = 50
  • 求餘:%
        求餘的結果不一定是整數,由於需要經過除法運算,所以必需滿足除法的運算規則;當兩個數都爲整數類型時,第二個數不能爲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.0int 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(前面省略240),9的二進制碼爲00001001(前面省略240000001015000010019)
--------- &
00000001(結果1
  • 按位或(只要有一位爲1時就返回1):|
int a = 5;
int b = 9;
//c 的值位13
int c = a | b;
5的二進制碼爲00000101(前面省略240),9的二進制碼爲00001001(前面省略240000001015000010019)
--------- |
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(前面省略240),9的二進制碼爲00001001(前面省略240000001015000010019)
--------- ^
00001100(結果12
  • 左移運算符:<<
        左移運算符是將操作符的二進制碼整體左移指定位數,左移空出來的位以0填充
int a = 5;
//b 的值爲20
int b = 5 << 2;
5的二進制碼爲00000101(前面省略240),左移2位爲00010100,結果爲20int c = -5//d 的結果爲-20
int d = -5 << 2;
-5的二進制碼爲11111011(前面省略241),左移2位爲11101100,結果爲-20
  • 右移運算符:>>
        右移運算符是將操作數的二進制碼整體右移指定的位數,右移空出來的位以原來的符號爲填充;
int a = 5;
//b 的值爲1
int b = a >> 2;
5的二進制碼爲00000101(前面省略240),右移2位爲00000001,結果爲1int c = -5int d = c >> 2;
-5的二進制碼爲11111011(前面省略241),右移2位爲11111110,結果爲-2
  • 無符號右移運算符:>>>
        無符號右移運算符是將操作數的二進制碼整體右移指定的位數,右移空出來的位總是補0;
int a = -5;
//b 的值爲1073741822
int b = a >>> 2;
-5的二進制碼爲11111011(前面省略241),無符號右移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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章