前言
上一篇java專欄我們講解了java的各個類型,這期我們來繼續學習java的算術運算符,大家一起行動起來,你就是將來的java大佬!
一、算術運算符
基礎四則運算符和C語言是一樣的,都是+ - * / %
規則很簡單,但我們需要對除法運算特別注意
1.1 int/int結果還是int
這里和我們的數學里的運算是不一樣的,舉個例子:1/2
數學中我們很快知道這個是0.5,但在計算機語言中,整形/整形結果會默認是整形,小數位會被移除,所以java中1/2結果是0
1
2
3
4
5
|
public static void main(String[] args) { int a= 1 ; int b= 2 ; System.out.println(a/b); //打印0,如果需要小數,要有double } |
1.2 0不能作為除數
這個和數學里是一樣的,0不能作為除數,否則系統會報錯
1
2
3
4
5
6
|
public static void main(String[] args) { int a= 1 ; int c= 0 ; System.out.println(a/c); //0是不能作為除數的,這里會異常 System.out.println( "hhh" ); //由于上一行代碼異常了,所以從上面一段開始往后都不執行了 } |
1.3 關于%
這個符號是用來求余數的,比如10/3=3…1,那么10%3=1
1
2
3
4
5
6
7
|
public static void main(String[] args) { System.out.println( 10 % 3 ); //打印1 System.out.println(- 10 % 3 ); //-1 System.out.println( 10 %- 3 ); //1 System.out.println(- 10 %- 3 ); //-1 System.out.println( 11.5 % 3 ); //2.5 } |
1.4 增量賦值運算符+= -= *= /=
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) { int a= 10 ; a+= 1 ; //a=a+1 System.out.println(a); //打印11 short b= 1 ; //b=b+1;//直接這樣寫會報錯,因為單獨一個1默認是整形,整形與short型的b相加會提升到整形,直接賦值會出錯 b=( short )(b+ 1 ); //正確寫法1 b+= 1 ; //正確寫法2 } |
其他增量運算符也是一樣的,a-=n也就是a=a-n,剩下的以此類推
關于short b=1;b+=1;在java中如果是增量賦值運算符,系統會自動幫你進行強制類型轉換,但是如果你直接寫b=b+1是會報錯的,這時需要你自己手動強制類型轉換
1.5 自增或自減運算
a++和++a的區別就是,前者是先用a,然后給a+1;后者是先給a+1,然后用a
比如,a=0;if(a++)這里的if里面就是0,因為是先用了a=0,然后給a+1。
a=0;if(++a)這里面的if就是1,因為是先給a+1,a已經變成1了,然后用a。
1
2
3
4
5
6
7
8
9
10
|
public static void main(String[] args) { int a= 10 ; int a2=a++; System.out.println(a); //打印11 System.out.println(a2); //打印10 int b= 10 ; int b2=++b; System.out.println(b); //打印11 System.out.println(b2); //打印11 } |
二、關系運算符
關系運算符共有6個:
== 判斷兩邊是否相等
!=判斷兩邊是否不等
<和>小于和大于符號
<=和> =小于等于和大于等于符號
1
2
3
4
5
6
7
8
9
10
|
public static void main(String[] args) { int a= 10 ; int b= 20 ; System.out.println(a==b); //false System.out.println(a!=b); //true System.out.println(a<b); //true System.out.println(a>b); //false System.out.println(a<=b); //true System.out.println(a>=b); //false } |
這里和C語言不同的是,C語言中關系運算符成立是1,不成立是0。但java中不一樣,java中關系運算符的表達式返回值都是boolean類型,也就是說,只有true或false沒有1和0
ps:java中判斷是if(布爾表達式)而不是C語言中的if(1/0)
三、邏輯運算符
常用邏輯運算符主要有三個:&&,||,!
注意:邏輯運算符的操作數(操作數往往是關系運算符的結果)和返回值都是boolean
3.1 邏輯與&&
大白話說就是高中我們學的 ^ “且”的意思
也就是說 表達式1&&表達式1 必須全真為真,一假為假
規則:兩個操作數都是true,結果為true,否則結果為false
ps:短路——如果表達式1是假,表達式整體肯定是假,計算機系統就不會浪費時間去判斷表達式2了。
1
2
3
4
5
6
7
|
public static void main(String[] args) { int a= 10 ; int b= 20 ; int c= 30 ; System.out.println(a<b&&b<c); //a<b成立且b<c成立,所以式子整體成立,打印true System.out.println(a>b&&b<c); //a>b不成立,不管b<c是否成立,式子整體肯定是false } |
3.2 邏輯或||
也就是我們高中學的v“或”的意思
表達式1||表達式2 有一真為真,全假為假
規則:兩個操作數一個是true,結果為true,兩操作數全為false,結果為false
短路——表達式1為真,表達式整體肯定為真,不用再判斷表達式2了
1
2
3
4
5
6
|
public static void main(String[] args) { int a= 10 ; int b= 20 ; int c= 30 ; System.out.println(a<b||b>c); //a<b成立就不用再判斷b>c是否成立了,式子整體肯定為true } |
3.3 邏輯非!
!布爾表達式
!false=true
!true=false
注意:!是一個單目運算符,只有一個操作數
1
2
3
4
5
6
7
|
public static void main(String[] args) { int a= 10 ; int b= 20 ; //System.out.println(!a<b);//這樣會報錯 System.out.println(!(a<b)); //如果要對a<b這個式子進行真假判斷,必須加括號 } |
注:&和|(不推薦使用)
&和|如果操作數是boolean時,也可以表示邏輯運算,但是與&&和||相比,它們不支持短路求值。
四、位運算符
java中對數據的操作的最小單位不是字節,而是二進制位
位運算符主要有4個:&,|,^,~
位操作表示按二進制位運算,計算機中都是用二進制來表示數據(0/1構成的數字序列),位運算就是按照二進制每一位依次進行計算
4.1 按位與&
如果兩個對應二進制位都是1,結果為1,否則結果為0
1
2
3
4
5
6
|
public static void main(String[] args) { int a= 10 ; //0000 1010 int b= 20 ; //0001 0100 //按位與: 0000 0000 對應的數字為0 System.out.println(a&b); //打印0 } |
4.2 按位或|
如果兩個對應二進制位有1,結果為1,全是0為0
1
|
public static void main(String[] args) {<br> int a= 10 ; //0000 1010<br> int b=20;//0001 0100<br> //按位或: 0001 1110 對應的數字為30<br> System.out.println(a|b);//打印30<br> }<br> |
4.3 按位異或^
如果兩個對應二進制位相異為1,相同為0
1
|
public static void main(String[] args) {<br> int a= 10 ; //0000 1010<br> int b=30;//0001 1110<br> //按位異或 0001 0100 對應的數字為20<br> System.out.println(a^b);//打印20<br> }<br> |
本質就是找不同
4.4 按位取反~
二進制位上是0變成1,1變成0
1
2
3
4
5
6
7
|
public static void main(String[] args) { int a= 10 ; //0000 0000 0000 0000 0000 0000 00001010 //按位取反 1111 1111 1111 1111 1111 1111 1111 0101 //16進制打印 f f f f f f f 5 //ps:4位2進制是16種情況,對應16進制的16個數 System.out.printf( "%x\n" ,~a); //打印fffffff5 } |
五、移位運算
移位運算符有三個:
<< >> >>>
都是按照二進制位運算
注意:移位移動的是補碼,如果是正數,原碼和補碼一樣,所以你直接移動原碼也可以
,但是如果是負數,你必須先轉換成補碼移位,然后再轉換成原碼
5.1 左移<<
最左側位不要了,最右側補0
比如現在有一個二進制數0000 1011(十進制11),我們對其進行移1位操作
0000 1011<<1
000 10110(對應十進制的22)
左邊的0不要了,后面往左跟進一位,最右邊會空出一位,我們進行補0操作
實際效果相當于11*2^1
再舉一個例子:仍然是上面的二進制數0000 1011,進行移2位操作
0000 1011<<2
00 101100(對應十進制的44)
左移兩位,左邊兩個數就不要了,最右邊會空出2位,我們補0
實際效果相當于11*2^2
1
2
3
4
5
|
public static void main(String[] args) { int a= 11 ; System.out.println(a<< 1 ); //打印22 System.out.println(a<< 2 ); //打印44 } |
5.2 右移>>
右移,左邊補符號位
注意:是符號位,是符號位,是符號位(重要的事情說三遍)
比如0000 1011>>1
得到0000 0101(十進制的5)
實際效果相當于11/(2^1)
再舉個例子-11,二進制1000 1011
1000 1011(原)
1111 0100(反)
1111 0101(補)
補碼進行右移1位
1111 1010(新補碼)
1111 1001(新反碼)
1000 0110(新原碼)
新原碼對應十進制數-6
1
2
3
4
5
6
|
public static void main(String[] args) { int a= 11 ; int b=- 11 ; System.out.println(a>> 1 ); //打印5 System.out.println(b>> 1 ); //打印-6 } |
5.3 無符號右移>>>
不管符號位是啥,左邊統一補0
由于是無符號了,也就說沒有所謂的負數了,也就說數值首位不再是符號位了。
那么1000 1010(十進制138)右移1位,得到0100 0101(十進制的69)
1
2
3
4
|
public static void main(String[] args) { int a= 138 ; System.out.println(a>>> 1 ); //打印69 } |
那講到這里,大家可能會問,哎,你怎么不講無符號左移啊?
講個笑話:沒有無符號左移
不是說我不講無符號左移啊,是真的這玩意不存在啊哈哈哈。
為什么呢?打個比方,你現在左移一位,那你右邊不還是補0嘛,那這不就是(有符號)左移嗎?
六、條件運算符
條件運算符和c語言一樣:
表達式1?表達式2:表達式3
判斷表達式1是否成立,成立執行表達式2,否則執行表達式3
1
2
3
4
5
6
|
public static void main(String[] args) { int a= 10 ; int b= 20 ; int max=a>b?a:b; //a>b不成立,執行b,也就說b賦值給max System.out.println(max); //打印20 } |
總結
好啦,這就是今天的全部內容,內容量不大,但都是java必須掌握的知識點,希望讀者耐心學習,最后祝讀者學業有成。更多關于java運算符教程的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/m0_57180439/article/details/120758261