精辟全面且細(xì)致的java運(yùn)算符教程詳解
前言
上一篇java專欄我們講解了java的各個類型,這期我們來繼續(xù)學(xué)習(xí)java的算術(shù)運(yùn)算符,大家一起行動起來,你就是將來的java大佬!
一、算術(shù)運(yùn)算符
基礎(chǔ)四則運(yùn)算符和C語言是一樣的,都是+ - * / %
規(guī)則很簡單,但我們需要對除法運(yùn)算特別注意
1.1 int/int結(jié)果還是int
這里和我們的數(shù)學(xué)里的運(yùn)算是不一樣的,舉個例子:1/2
數(shù)學(xué)中我們很快知道這個是0.5,但在計算機(jī)語言中,整形/整形結(jié)果會默認(rèn)是整形,小數(shù)位會被移除,所以java中1/2結(jié)果是0
public static void main(String[] args) { int a=1; int b=2; System.out.println(a/b);//打印0,如果需要小數(shù),要有double }
1.2 0不能作為除數(shù)
這個和數(shù)學(xué)里是一樣的,0不能作為除數(shù),否則系統(tǒng)會報錯
public static void main(String[] args) { int a=1; int c=0; System.out.println(a/c);//0是不能作為除數(shù)的,這里會異常 System.out.println("hhh");//由于上一行代碼異常了,所以從上面一段開始往后都不執(zhí)行了 }
1.3 關(guān)于%
這個符號是用來求余數(shù)的,比如10/3=3…1,那么10%3=1
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 增量賦值運(yùn)算符+= -= *= /=
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;//直接這樣寫會報錯,因?yàn)閱为?dú)一個1默認(rèn)是整形,整形與short型的b相加會提升到整形,直接賦值會出錯 b=(short)(b+1);//正確寫法1 b+=1;//正確寫法2 }
其他增量運(yùn)算符也是一樣的,a-=n也就是a=a-n,剩下的以此類推
關(guān)于short b=1;b+=1;在java中如果是增量賦值運(yùn)算符,系統(tǒng)會自動幫你進(jìn)行強(qiáng)制類型轉(zhuǎn)換,但是如果你直接寫b=b+1是會報錯的,這時需要你自己手動強(qiáng)制類型轉(zhuǎn)換
1.5 自增或自減運(yùn)算
a++和++a的區(qū)別就是,前者是先用a,然后給a+1;后者是先給a+1,然后用a
比如,a=0;if(a++)這里的if里面就是0,因?yàn)槭窍扔昧薬=0,然后給a+1。
a=0;if(++a)這里面的if就是1,因?yàn)槭窍冉oa+1,a已經(jīng)變成1了,然后用a。
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 }
二、關(guān)系運(yùn)算符
關(guān)系運(yùn)算符共有6個:
== 判斷兩邊是否相等
!=判斷兩邊是否不等
<和>小于和大于符號
<=和> =小于等于和大于等于符號
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語言中關(guān)系運(yùn)算符成立是1,不成立是0。但java中不一樣,java中關(guān)系運(yùn)算符的表達(dá)式返回值都是boolean類型,也就是說,只有true或false沒有1和0
ps:java中判斷是if(布爾表達(dá)式)而不是C語言中的if(1/0)
三、邏輯運(yùn)算符
常用邏輯運(yùn)算符主要有三個:&&,||,!
注意:邏輯運(yùn)算符的操作數(shù)(操作數(shù)往往是關(guān)系運(yùn)算符的結(jié)果)和返回值都是boolean
3.1 邏輯與&&
大白話說就是高中我們學(xué)的 ^ “且”的意思
也就是說 表達(dá)式1&&表達(dá)式1 必須全真為真,一假為假
規(guī)則:兩個操作數(shù)都是true,結(jié)果為true,否則結(jié)果為false
ps:短路——如果表達(dá)式1是假,表達(dá)式整體肯定是假,計算機(jī)系統(tǒng)就不會浪費(fèi)時間去判斷表達(dá)式2了。
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 邏輯或||
也就是我們高中學(xué)的v“或”的意思
表達(dá)式1||表達(dá)式2 有一真為真,全假為假
規(guī)則:兩個操作數(shù)一個是true,結(jié)果為true,兩操作數(shù)全為false,結(jié)果為false
短路——表達(dá)式1為真,表達(dá)式整體肯定為真,不用再判斷表達(dá)式2了
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 邏輯非!
!布爾表達(dá)式
!false=true
!true=false
注意:!是一個單目運(yùn)算符,只有一個操作數(shù)
public static void main(String[] args) { int a=10; int b=20; //System.out.println(!a<b);//這樣會報錯 System.out.println(!(a<b)); //如果要對a<b這個式子進(jìn)行真假判斷,必須加括號 }
注:&和|(不推薦使用)
&和|如果操作數(shù)是boolean時,也可以表示邏輯運(yùn)算,但是與&&和||相比,它們不支持短路求值。
四、位運(yùn)算符
java中對數(shù)據(jù)的操作的最小單位不是字節(jié),而是二進(jìn)制位
位運(yùn)算符主要有4個:&,|,^,~
位操作表示按二進(jìn)制位運(yùn)算,計算機(jī)中都是用二進(jìn)制來表示數(shù)據(jù)(0/1構(gòu)成的數(shù)字序列),位運(yùn)算就是按照二進(jìn)制每一位依次進(jìn)行計算
4.1 按位與&
如果兩個對應(yīng)二進(jìn)制位都是1,結(jié)果為1,否則結(jié)果為0
public static void main(String[] args) { int a=10;//0000 1010 int b=20;//0001 0100 //按位與: 0000 0000 對應(yīng)的數(shù)字為0 System.out.println(a&b);//打印0 }
4.2 按位或|
如果兩個對應(yīng)二進(jìn)制位有1,結(jié)果為1,全是0為0
public static void main(String[] args) {
int a=10;//0000 1010
int b=20;//0001 0100
//按位或: 0001 1110 對應(yīng)的數(shù)字為30
System.out.println(a|b);//打印30
}
4.3 按位異或^
如果兩個對應(yīng)二進(jìn)制位相異為1,相同為0
public static void main(String[] args) {
int a=10;//0000 1010
int b=30;//0001 1110
//按位異或 0001 0100 對應(yīng)的數(shù)字為20
System.out.println(a^b);//打印20
}
本質(zhì)就是找不同
4.4 按位取反~
二進(jìn)制位上是0變成1,1變成0
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進(jìn)制打印 f f f f f f f 5 //ps:4位2進(jìn)制是16種情況,對應(yīng)16進(jìn)制的16個數(shù) System.out.printf("%x\n",~a);//打印fffffff5 }
五、移位運(yùn)算
移位運(yùn)算符有三個:
<< >> >>>
都是按照二進(jìn)制位運(yùn)算
注意:移位移動的是補(bǔ)碼,如果是正數(shù),原碼和補(bǔ)碼一樣,所以你直接移動原碼也可以
,但是如果是負(fù)數(shù),你必須先轉(zhuǎn)換成補(bǔ)碼移位,然后再轉(zhuǎn)換成原碼
5.1 左移<<
最左側(cè)位不要了,最右側(cè)補(bǔ)0
比如現(xiàn)在有一個二進(jìn)制數(shù)0000 1011(十進(jìn)制11),我們對其進(jìn)行移1位操作
0000 1011<<1
000 10110(對應(yīng)十進(jìn)制的22)
左邊的0不要了,后面往左跟進(jìn)一位,最右邊會空出一位,我們進(jìn)行補(bǔ)0操作
實(shí)際效果相當(dāng)于11*2^1
再舉一個例子:仍然是上面的二進(jìn)制數(shù)0000 1011,進(jìn)行移2位操作
0000 1011<<2
00 101100(對應(yīng)十進(jìn)制的44)
左移兩位,左邊兩個數(shù)就不要了,最右邊會空出2位,我們補(bǔ)0
實(shí)際效果相當(dāng)于11*2^2
public static void main(String[] args) { int a=11; System.out.println(a<<1);//打印22 System.out.println(a<<2);//打印44 }
5.2 右移>>
右移,左邊補(bǔ)符號位
注意:是符號位,是符號位,是符號位(重要的事情說三遍)
比如0000 1011>>1
得到0000 0101(十進(jìn)制的5)
實(shí)際效果相當(dāng)于11/(2^1)
再舉個例子-11,二進(jìn)制1000 1011
1000 1011(原)
1111 0100(反)
1111 0101(補(bǔ))
補(bǔ)碼進(jìn)行右移1位
1111 1010(新補(bǔ)碼)
1111 1001(新反碼)
1000 0110(新原碼)
新原碼對應(yīng)十進(jìn)制數(shù)-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 無符號右移>>>
不管符號位是啥,左邊統(tǒng)一補(bǔ)0
由于是無符號了,也就說沒有所謂的負(fù)數(shù)了,也就說數(shù)值首位不再是符號位了。
那么1000 1010(十進(jìn)制138)右移1位,得到0100 0101(十進(jìn)制的69)
public static void main(String[] args) { int a=138; System.out.println(a>>>1);//打印69 }
那講到這里,大家可能會問,哎,你怎么不講無符號左移啊?
講個笑話:沒有無符號左移
不是說我不講無符號左移啊,是真的這玩意不存在啊哈哈哈。
為什么呢?打個比方,你現(xiàn)在左移一位,那你右邊不還是補(bǔ)0嘛,那這不就是(有符號)左移嗎?
六、條件運(yùn)算符
條件運(yùn)算符和c語言一樣:
表達(dá)式1?表達(dá)式2:表達(dá)式3
判斷表達(dá)式1是否成立,成立執(zhí)行表達(dá)式2,否則執(zhí)行表達(dá)式3
public static void main(String[] args) { int a=10; int b=20; int max=a>b?a:b;//a>b不成立,執(zhí)行b,也就說b賦值給max System.out.println(max);//打印20 }
總結(jié)
好啦,這就是今天的全部內(nèi)容,內(nèi)容量不大,但都是java必須掌握的知識點(diǎn),希望讀者耐心學(xué)習(xí),最后祝讀者學(xué)業(yè)有成。更多關(guān)于java運(yùn)算符教程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文詳解Spring的Enablexxx注解使用實(shí)例
這篇文章主要為大家介紹了一文詳解Spring的Enablexxx注解使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Java對日期Date類進(jìn)行加減運(yùn)算、年份加減月份加減、時間差等等
這篇文章主要介紹了Java對日期Date類進(jìn)行加減運(yùn)算、年份加減月份加減、時間差等等,在網(wǎng)上查閱資料,加上自己總結(jié)的一些關(guān)于Date類的工具類2017-01-01迪米特法則_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了迪米特法則,迪米特法則就是一個在類創(chuàng)建方法和屬性時需要遵守的法則,有興趣的可以了解一下2017-08-08Java使用Request獲取請求參數(shù)的通用方式詳解
這篇文章主要給大家介紹了關(guān)于Java使用Request獲取請求參數(shù)的通用方式,在Java后端開發(fā)中第一步就是獲取前端傳過來的請求參數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Java 交換兩個變量的數(shù)值實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狫ava 交換兩個變量的數(shù)值實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07最簡單的MyBatis Plus的多表聯(lián)接、分頁查詢實(shí)現(xiàn)方法
這篇文章主要介紹了最簡單的MyBatis Plus的多表聯(lián)接、分頁查詢實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11