一、算術運算符
運算符 |
+ |
- |
* |
/ |
% |
說明 |
加 |
減 |
乘 |
除 |
取模(余數) |
例子 |
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
我們要實現一個數的自增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 |
邏輯運算符非常重要,尤其是在學習了后面的條件判斷后,會大量使用這些邏輯運算符。
1、與運算
與運算符號有&和&&兩個,表示必須兩個條件都為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。
2、或運算
或運算符號有|和||兩個,表示兩個條件只要有一個滿足為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。
3、取反運算符
取反運算符只有一個!,它是單元運算符,這個比較簡單,如果是true就返回false,false就返回true,如下面的示例:
!(1>2) !(2>1)
其對應比較運算過程就是
!false !true
所以第一個返回是true,第二個返回是false。
4、組合的邏輯運算符
邏輯符可以組合使用,並結合上面比較運算符,形成一個復雜的條件判斷,比如下面這個判斷是否是閏年的條件判斷式,閏年的判斷條件是,如果此年份是4的陪數,但不是100的陪數,那么就是閏年,如果是100的陪數,還要是400的倍數才是閏年,實現代碼如下:
int year=2008; boolean result=year%4==0&&year%100!= 0||year % 400 == 0;
5、 &和&&、|和||的區別
參與運算的都是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兩種情況賦予賦予不同的返回值,其語法如下:
表達式?值1:值2;
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。前面介紹過,計算機都是采用補碼的方式運行的,所以參與運算的數都是補碼方式進行的。如下面所示例子:
1、按位與
int b=5;//int 是 32 位 取最后的8位是 00000101 System.out.println(a&b);//結果是 00000001
如代碼所示00000001和00000101運算的結果是00000001。所以最后輸出的結果是1 。
2、按位或
按位或運算符“|”就是實現參與運算的兩個數對應的二進制位數執行或的操作。如果兩個二進位均為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。
3、按位異或
按位異或運算符“^”就是實現參與運算的兩個數對應的二進制位數執行異或的操作。如果兩個二進位相同時,結果位為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
4、求反
求反運算符只是單目運算符,具有右結合性,這個功能比較簡單,就是對參與運算的數的各二進位按位求反。但是這個結果需要補碼的運算有所了解才行。
//int 是 32 位 對應二進制就是 00000000 00000000 00000000 00000001 int a=1; //結果也是 32 位 對應的二進制是 11111111 11111111 11111111 11111110 System.out.println(~a);
因為部門的第一位是符號位,按照補碼的運算,對應的結果就是-2了。
5、左移
左移運算符“<<”其功能把“<<”左邊的運算數的各二進位根據右邊定義的數量全部左移若干位,移動的數位由右邊所定義的數量決定。 移動時依據高位丟棄,低位補0的原則。
int a = 2;//int 是 32 位 取最后的8位是 00000010 System.out.println(a<<1);//左移一位后就是 00000100
最后輸出的結果是4,由上面的示例可知,每左移一位后,所得到的結果就是原來的數據乘以2,所以很多時候我們在做乘以2的操作是都是使用這個左移操作,以提高效率。
6、右移
右移運算符“>>”其功能把“>>”左邊的運算數的各二進位根據右邊定義的數量全部右移若干位,移動的數位由右邊所定義的數量決定。 也是按照移動時依據高位丟棄,低位補0的原則。
int a = 12;//int 是 32 位 取最后的8位是 00001100 System.out.println(a>>2);//左移一位后就是 00000110
結果是3,由上面的示例可知,和左移正好相反,每右移一位后,所得到的結果就是原來的數據除以2,所以很多時候我們在做除以2的操作是都也是使用這個由移操作,以提高效率。