運算符java |
+學習 |
-測試 |
*spa |
/code |
%blog |
說明ci |
加作用域 |
減數學 |
乘it |
除 |
取模(餘數) |
例子 |
1+2 |
5-3 |
20*5 |
6/4 |
30%9 |
結果 |
3 |
2 |
100 |
1 |
3 |
int x = 10; int y = 6; int result=x/y; System.out.println(result);
其結果是1,不會帶有小數部分,也就是整數運算後的到的結果也是整數,不會自動變成浮點數。
上面所具的例子都是表示二元運算符,也就是說有兩個運算參數,其中「+」和「-」兩個符也能夠表示一元運算符,分別表示正數和負數這些運算符也能夠組合成爲一個複雜的運算式子,以下面這個例子:
int x = 10,y = 6,a = 20,b = 2; int result=-x/y+a-b+a%x+-a; System.out.println(result);
上面示例會先計算小括號的x+y和a-b兩個式子,而後在按照先先乘除後加減,從左到右的計算順序。
運算符 |
= |
+= |
-= |
*= |
/= |
++ |
-- |
說明 |
賦值 |
加等於 |
減等於 |
乘等於 |
除等於 |
自增1 |
自減1 |
例子 |
x=10 |
x+=y; |
y-=5; |
y*=z-3; |
z/=3; |
y++; |
x-- |
等價於 |
x=x+y; |
y=y-5; |
y=y*(z-3); |
z=z/3; |
y=y+1; |
x=x-1; |
程序中「=」的意義與咱們平時的數學計算的式子不一樣,他表示賦值的意思,就是把賦值表達式中右邊的計算結果賦值左邊的變量中。以下面這裏例子都是賦值運算:
int x=5; //用專業的說法是把右邊5的值賦值給左邊的int變量x int y=x=6; // y和x都賦值6; int a; a=100+200;
在賦值運算時,常常會出現左邊的變量重複出如今賦值表達式的右邊,如:
int a=100; a=a+200;
a=a+200;
等價於如下形式:
a+=200;
概括一下也就是,若是expr1和expr2分別代碼兩個表達式,op表明運算符號,那麼:
expr1=(expr1) op (expr2)
等價於
expr1 op= expr2;
注意第一個表達式,有時候括號是不可缺乏的,好比如下這個例子:
int a=10,b=3; a*=b+1;
其意思是:
a=a*(b+1);
而不是:
a=a*b+1;
咱們要實現一個數的自增1或者自減1,目前能夠有如下兩種方法:
a=a+1或者a+=1;
a=a-1或者a-=1;
可是因爲在編寫程序時自增1或者自減1用得很是頻繁,java語言提供了兩個專門用於變量的自增1和自減1的特殊運算符,其中++是自增1運算符號,可使操做數自增1,--是自減1運算符號,可使操做數自減1。好比下面這個例子就是自增1:
int i=1; i++; System.out.println(i);//結果是2
須要特別留意的是++和--運算符能夠前置、後置,都是合法的語句,如a++和++a都是合法的,上面這兩種寫法其最終的結果都是是變量a的值加1了,可是它們之間也是有區別的,其區別是:表達是++a會先將a的值自增1,而後在使用變量a。而表達式a++是先使用了a的值,而後再讓a的值自增1。也就是說在一些表達式,使用a++和使用++a獲得的結果時不同的。例如:
int a=1; int b= a++; System.out.println(b);//這時候b是1
int a=1; int b= ++a; System.out.println(b);//這時候b是
int a=1,b=1,c; c=++a+b++; System.out.println("a="+a); System.out.println("b="+b); System.out.println("c="+c); //c最後的值是3
最後再提一下++和--兩個運算符都只能做用於變量,而不做用域表達式。以下面這個例子是非法的。
int a=1,b=1; (a+b)++;
比較運算符也稱爲關係運算符,用於測試兩個操做數之間的關係。使用關係運算符表達式的最終結果爲 boolean 型,也就是其結果只有兩個true和false。具體運算符號以下表所示:
運算符 |
== |
!= |
> |
< |
>= |
<= |
比較 |
等於 |
不等 |
大於 |
小於 |
大於等於 |
小於等於 |
例子 |
i==1; |
i!=1; |
i >1; |
i<1; |
i>=1; |
i<=1; |
結果 |
true |
false |
false |
false |
true |
true |
由上表所示,咱們判斷兩個數是否相等使用兩個等號(==),它與(!=)具備相同的優先級。比>、<、>=、<=的優先級要高,可是算術運算符的優先級比關係運算符高,也就是說i<a+100和i<(a+100)等結果都是同樣。不一樣數據類型之間也能夠進行比較,它們會被自動轉換爲相同的類型後再比較,如如下例子:
int x = 10; float y=10.9f; char a='0'; System.out.println(x>y); System.out.println(a>x);
運算符 |
& |
| |
! |
&& |
|| |
說明 |
與 |
或 |
非 |
阻斷與 |
阻斷或 |
示例 |
true&false |
True|false |
!false |
true&&false |
true||false |
結果 |
false |
true |
true |
false |
true |
邏輯運算符很是重要,尤爲是在學習了後面的條件判斷後,會大量使用這些邏輯運算符。
與運算符號有&和&&兩個,表示必須兩個條件都爲true時,結果才能返回true。如:
(1>2)&&(1>3) (1>2)&&(3>1) (2>1)&&(1>3) (2>1)&&(3>1)
其對應比較運算過程就是
false&&false false&&true true&&false true&&true
也就是最後的結果就是前面三個的返回都是false,只有最後一個是true。
或運算符號有|和||兩個,表示兩個條件只要有一個知足爲true,最後結果返回true。仍是以上面例子說明如:
(1>2)&&(1>3) (1>2)&&(3>1) (2>1)&&(1>3) (2>1)&&(3>1)
其對應比較運算過程就是
false&&false false&&true true&&false true&&true
也就是最後的結果就是第一個返回爲false,後面三個返回都是true。
取反運算符只有一個!,它是單元運算符,這個比較簡單,若是是true就返回false,false就返回true,以下面的示例:
!(1>2) !(2>1)
其對應比較運算過程就是
!false !true
因此第一個返回是true,第二個返回是false。
邏輯符能夠組合使用,並結合上面比較運算符,造成一個複雜的條件判斷,好比下面這個判斷是不是閏年的條件判斷式,閏年的判斷條件是,若是此年份是4的陪數,但不是100的陪數,那麼就是閏年,若是是100的陪數,還要是400的倍數纔是閏年,實現代碼以下:
int year=2008; boolean result=year%4==0&&year%100!= 0||year % 400 == 0;
參與運算的都是boolean布爾類型,在上表中的邏輯運算符&和&&、|和||的示例中,結果的都是同樣的,可是在運算時卻有區別。&&和||有一些比較特殊的屬性,其運算的順序是從左至右進行判斷的,可是對&&而言若是在判斷時獲得的結果是false時,那麼後面的計算就不會繼續,對||而言,若是在判斷時獲得的結果是true,那麼後面的計算也不會繼續,這種機制稱之爲阻斷判斷或者短路判斷,在有些狀況之下,這種機制能夠提升程序運行的效率。
int x=1,y=2; boolean b; b=x>y&&++x==--y;
b, x, y的值分別是false, 1, 2。x和y雖然上面都有自增和自減的表達式,可是卻並無執行,那是由於x>y的結果是false,後面使用了短路判斷&&,因此無論後面的表達式的結果是什麼,最後的結果必然是false,因此後面的++x和--y其實都沒有執行過,若是改爲如下例子:
int x=1,y=2; boolean b; b=x>y&++x==--y;
由於使用了&符號,因此b, x, y的值是false, 2, 1了。
java的條件運算符是三元運算符,也就是說有三個參數參與運算,其功能是對錶達式條件進行判斷,根據判斷結果是true或者false兩種狀況賦予賦予不一樣的返回值,其語法以下:
int a=2; int b=1; int c=(a>b)?3:4; System.out.println(c);
位運算符在java的企業應用中使用的頻率並不高,可是在一些追求效率和編寫底層應用時,仍是會用到位運算符,前面介紹的各類運算都是基本都是以字節做爲最基本位進行運算的,而位運算符是以位(bit)做爲運算單位的,因此要弄明白位運算符,必需要知道二進制表示法。
int a=1;//int 是 32 位 取最後的8位是 00000001按位位與運算符"&"就是實現參與運算的兩個數對應的二進制位數執行與的操做。若是兩個二進位均爲1時,結果位才爲1,不然就爲0。前面介紹過,計算機都是採用補碼的方式運行的,因此參與運算的數都是補碼方式進行的。以下面所示例子:
int b=5;//int 是 32 位 取最後的8位是 00000101 System.out.println(a&b);//結果是 00000001
如代碼所示00000001和00000101運算的結果是00000001。因此最後輸出的結果是1 。
按位或運算符「|」就是實現參與運算的兩個數對應的二進制位數執行或的操做。若是兩個二進位均爲0時,結果位才爲0,不然就爲1。咱們繼續以上面所示的例子:
int a=1;//int 是 32 位 取最後的8位是 00000001 int b=5;//int 是 32 位 取最後的8位是 00000101 System.out.println(a|b);//結果是 00000101
如代碼所示00000001和00000101運算的結果是00000001。因此最後輸出的結果是5。
按位異或運算符「^」就是實現參與運算的兩個數對應的二進制位數執行異或的操做。若是兩個二進位相同時,結果位爲0,不一樣時就爲否1,簡稱「同0異1」。也就是說兩個都是1或者兩個都是0時結果爲0,不然爲1。仍是以上面做爲例子
int a=1;//int 是 32 位 取最後的8位是 00000001 int b=5;//int 是 32 位 取最後的8位是 00000101 System.out.println(a^b);//結果是 00000100
如代碼所示00000001和00000101運算的結果是00000100。因此最後輸出的結果是4
求反運算符只是單目運算符,具備右結合性,這個功能比較簡單,就是對參與運算的數的各二進位按位求反。可是這個結果須要補碼的運算有所瞭解才行。
//int 是 32 位 對應二進制就是 00000000 00000000 00000000 00000001 int a=1; //結果也是 32 位 對應的二進制是 11111111 11111111 11111111 11111110 System.out.println(~a);
由於部門的第一位是符號位,按照補碼的運算,對應的結果就是-2了。
左移運算符「<<」其功能把「<<」左邊的運算數的各二進位根據右邊定義的數量所有左移若干位,移動的數位由右邊所定義的數量決定。 移動時依據高位丟棄,低位補0的原則。
int a = 2;//int 是 32 位 取最後的8位是 00000010 System.out.println(a<<1);//左移一位後就是 00000100
最後輸出的結果是4,由上面的示例可知,每左移一位後,所獲得的結果就是原來的數據乘以2,因此不少時候咱們在作乘以2的操做是都是使用這個左移操做,以提升效率。
右移運算符「>>」其功能把「>>」左邊的運算數的各二進位根據右邊定義的數量所有右移若干位,移動的數位由右邊所定義的數量決定。 也是按照移動時依據高位丟棄,低位補0的原則。
int a = 12;//int 是 32 位 取最後的8位是 00001100 System.out.println(a>>2);//左移一位後就是 00000110
結果是3,由上面的示例可知,和左移正好相反,每右移一位後,所獲得的結果就是原來的數據除以2,因此不少時候咱們在作除以2的操做是都也是使用這個由移操做,以提升效率。