張小飛的Java之路——第四章
寫在前面:
視頻是什么東西,有看文檔精彩嗎?
視頻是什么東西,有看文檔速度快嗎?
視頻是什么東西,有看文檔效率高嗎?
下午 2 點。諸小亮看著空蕩蕩的書房:“這小子,肯定又睡過了,不行,我得去找他”
來到張小飛的屋前,還沒開口,就聽到:
諸小亮:。。。。。。。
1. 表達式
十分鐘后,兩人重新來到了書房。
諸小亮:“咱們繼續(xù)上課,首先來認識一下 表達式”
表達式:就是 數(shù)據(jù)的表達方式?
比如:int a = 2;那么 a 就是 2 的表達方式,所以 a 就是表達式
張小飛:“a 不應(yīng)該是標識符嗎?怎么又成表達式了”
“一樣的,只是叫法不同而已,這樣定義后,只要提到 a,我們就明白它代表的是 2 ?”
“我明白了,這相當于給數(shù)字 2 起了個綽號”
“可以這樣認為,但并不是很準確,因為下面的也是表達式:”
諸小亮“總之:只要能表示某個數(shù)據(jù)的代碼,都是表達式”
張小飛:“明白”
2. 運算符
諸小亮:“接著,我們說說 Java 中的運算符,畢竟計算機嘛,就是幫助人類做計算的”
張小飛:“不就是 加減乘除 嘛,這有什么說的”
“這你就不懂了,加減乘除只是最基本的,Java 中還有其他一些運算符,比如: %、++、-- 等,另外 Java 中的除法,跟我們平常中的除法也有點兒區(qū)別?”
“哦?這我倒是想見識一下,哪里不一樣”
“不要著急,Java中的運算符分為好幾種,我們一個一個說”
1. 算數(shù)運算符
1. + 、-、*、/
諸小亮:“咱們先看 算數(shù)運算符,其實就是: + 、-、*、/
“由于代碼太簡單,結(jié)果我就不輸出了,給你 2 分鐘,你自己看看吧”
“師兄,您接著說吧,這么簡單的東西,都不值得我動手”張小飛信心十足的說到
“好吧,上面的確實太簡單,不過需要注意一點:除法運算,看下面代碼:”

結(jié)果:

“這是什么情況,不應(yīng)該輸出 2.5 嗎?”張小飛問到
“2.5 是數(shù)學(xué)上的結(jié)果,Java 中,整數(shù)之間做除法,結(jié)果中的小數(shù)部分會被舍棄”
張小飛:“但是這樣的結(jié)果不正確啊,怎么能夠保留小數(shù)部分呢?”
諸小亮:“如果想保留小數(shù)部分,那么就只能:”

結(jié)果:

“哦,明白了,我自己來試試”
“師兄,我好奇嘗試一下把除數(shù)弄成 0,怎么會這樣子?”


“這表示程序出問題了,不過我們還沒講到這里,之后再說”
“好的,好的”
2. %:取模運算
張小飛:“這個 取模運算 是什么意思?”
諸小亮:“其實就是兩個數(shù)相除,獲取余數(shù),比如:”

結(jié)果:

張小飛:“這個有點兒意思,我來試試”
“師兄,我用正數(shù)測試是沒問題的,但是用負數(shù)的話。。。,結(jié)果:”


諸小亮:“這正是我要給你說的第二點:如果除數(shù)是負數(shù),負號可以忽略不計”
張小飛:“那,如果被除數(shù)是負數(shù)呢?我再來試試”


張小飛:“原來如此,如果被除數(shù)是負數(shù),就不能忽略負號了”
諸小亮:“還有一種比較特殊的取模:被除數(shù) 比 除數(shù) 小,比如:”


張小飛:“這個怎么解釋?”
諸小亮:“1 % 5,商是0,余數(shù)是1”
“哦...,明白了”
“還有一點需要記住:取模運算的結(jié)果,必然比除數(shù)小”
“這是當然,余數(shù)嘛,肯定比除數(shù)小”
3. ++:自增運算符
諸小亮:“++運算符,表示自己加 1,比如:”

上圖中:a++ 相當于 a = a+1,結(jié)果:

張小飛:“。。。。,我還以為是很高深的東西呢,就這?”
“你想多了,不過下面的就有些難度,比如:前置運算”
“哦?什么是前置運算?”張小飛興致勃勃的問到
“把 ++ 放到變量的前面,這就叫:前置運算,比如:”

“。。。。。。,你真無聊”
“哈哈,開個玩笑,下面的才真正能有難度,仔細看好:”


“師兄,感覺還需要您解釋一下”
“沒問題,其實上面代碼的運算邏輯,實際是:”
先執(zhí)行 ++ 操作,所以 a = 2;
然后把 a 的值賦給 b,所以 b = 2;
“明白,不過這也不難啊”
“稍等,讓我變形一下”


“這...,怎么會這樣呢?”張小飛疑惑道
“++ 放到變量后面,情況就不同了,這叫:后置運算,它的運算邏輯是這樣的:”
先臨時記錄 a 的值,比如:int temp = a;
然后執(zhí)行 ++ 操作,所以 a = 2;
最后把 temp 賦給 b,所以 b = 1;
“原來如此,我明白了”張小飛說到
4. --:自減運算
諸小亮:“--運算符,就是自己減 1,跟 ++ 類似,我就不介紹了,給你 5 分鐘,自己玩玩吧”
張小飛:“好的”
2. 賦值運算符
五分鐘后。
諸小亮:“接下來是 賦值運算”
張小飛:“師兄,賦值不就是 = 號嗎,這還要單獨講?”
“賦值運算符也有好幾個,= 只是其中一個,還有:+=, -=, *=, /=, %=,你看看下面代碼:”
“原來還可以這樣使用,我明白了”
“不過,需要明白,a += 3 跟 a = a + 3 還是有區(qū)別的,比如:”

“這是不是寫錯了,這個代碼編譯會報錯,s+3 是一個 int 類型的值,無法賦值給 s ”
“你說的沒錯,但是改一下的話:”

“這時候就可以編譯成功了,而且正常輸出”

張小飛疑惑道:“這是為什么呢?”
“很簡單:+= 是賦值運算符,如果兩邊的類型不一樣時會自動向低轉(zhuǎn)化,所以。。。。?!?/span>
“明白”
3. 比較運算符
諸小亮:“比較運算符也有好幾個:==、!=、>、>=、<、<=”
張小飛:“這個我知道,數(shù)學(xué)上也經(jīng)常使用”
“沒錯,不過在 Java 中,比較運算符的結(jié)果都是 boolean 型,要么是true,要么是false,比如:”
結(jié)果:

“這個比較簡單,也沒什么特殊的地方,看看就行”
“好的”
4. 邏輯運算符
諸小亮:“邏輯運算符,這個就復(fù)雜一些了”
張小飛:“師兄,你上面就說有難度,最后也沒發(fā)現(xiàn)難在哪兒了,別再忽悠了”
“咳咳,我說有難度了嗎,我說的是:它稍微復(fù)雜一些”諸小亮反駁道
“好好,是我聽錯了,您接著說”
“邏輯運算符,有 3 個:&&(且)、||(或)、!(非),咱們一個個解釋”
1. &&
諸小亮:“第一個:&&(且)”
作用:連接兩個表達式,兩個表達式都為 true,結(jié)果才為 true,否則為 false
示例:

結(jié)果:

張小飛:“還得用 && 連起來,a<b<c 這樣寫不行嗎?”
“不行,Java 中確實不允許a<b<c 這種寫法 ”
“好吧”
“另外,還需要注意:使用 && 時,只要第一個表達式的值是false,那么整體就是false”
上面的代碼:c < a && a < b,第一個c < a 是 false,所以整個表達式的值就是false
后面 a < c 不會繼續(xù)判斷,也就是 a<c 這個代碼不會執(zhí)行
“這個,可以證明一下嗎?”
“當然可以,修改一下代碼:”


張小飛:“原來如此, 如果 a / 0 執(zhí)行的話,就會報錯了”
2. ||
諸小亮:“第二個:||(或)”
作用:連接兩個表達式,兩個表達式只要有一個 true,結(jié)果就為 true
示例:

結(jié)果:

“這等于跟 && 剛好相反嘛”張小飛說到
“是的,不過:如果第一個表達式結(jié)果為true,整體結(jié)果就為true,不用再執(zhí)行第二個表達式”
“明白,跟 && 很類似”
3.!(非)
諸小亮:“第三個:!(非),這個更簡單”
作用:對表達式的值取反,如果表達式的值是true,取反后,結(jié)果就是:false
示例:

結(jié)果:

5. 位運算符
諸小亮:“師弟,下面我們講位運算,這個是真有難度”
張小飛:“。。。。?!?/span>
“你不信?好,我們來看看,位運算:直接數(shù)據(jù)對二進制進行運算”
“二進制運算?什么意思?”
1. <<
諸小亮:“<<:左移,一個數(shù)左移 N 位,相當于乘以 2 的 N 次方”
示例:

結(jié)果:

張小飛:“這個二進制又有什么關(guān)系呢?”
“很簡單,我們先看數(shù)字 1 的二進制:”

“左移 1 位,就是把所有二進制向左邊移動一個位置,結(jié)果:”

“這樣,左邊做高位的 0 就會超出 int 的邊界,也就舍棄掉了,不過最右邊也會出現(xiàn)一個空位,這時進行補 0 操作,最后結(jié)果:”

張小飛:“原來是這樣,我明白了”
2. >>
諸小亮:“然后是 >> (右移)”
>>:右移,一個數(shù)右移 N 位,相當于除以 2 的 N 次方
張小飛:“明白,右移跟左移剛好相反”
“是的,不過在右移后,左邊會出現(xiàn)空位,這時:”
如果是正數(shù):左邊補0
如果是負數(shù):左邊補1
“師兄,不對啊,為什么我這個右移后結(jié)果是0呢?”


諸小亮微微一笑:“我們再來回憶一下,1 的二進制”

“右移 1 位的結(jié)果:”

因為是正數(shù),所以左側(cè)補 0 ,最終結(jié)果:

張小飛:“原來如此,懂了懂了”
3. >>>
張小飛:“師兄,>>> 這個也是右移?”
諸小亮:“是的,這個右移。。。”
“是不是右移 N 位,就相當于除以 3 的 N 次方? ”張小飛搶答道
“。。。。,不是的,它的含義是:>>>:無符號右移,不管是正數(shù)、負數(shù),右移后,左邊統(tǒng)統(tǒng)補0”
“師弟,這個我就不詳細介紹了,你自己玩吧”
4. &
諸小亮:“接下來是 & (按位與)運算”
張小飛:“這不是 ‘且’ 嗎,怎么又叫 ‘按位與’ 了?”
“。。。,你仔細看清楚,且是 ‘&&’,這里是 ‘&’”
“哦哦,不好意思,看錯了,那這個具體是什么意思?”
“也是對二進制做運算,規(guī)則是:相同位置都是1,那么結(jié)果就為1,否則為0”
示例:

結(jié)果:

“這個,嗯。。。,還得麻煩您解釋一下”張小飛說到
“怎么樣,不是那么簡單吧,給你個圖,先看看”

“明白了,關(guān)鍵就在于:相同位置都是1,那么結(jié)果就為1,否則為0”
5. |
諸小亮:“師弟,這個要看清楚了,是 ‘|(按位或)’,可不是 ‘||’”
張小飛:“。。。,好啦好啦,這次看清了,趕緊說說是什么意思吧”
“對二進制做 或 運算,規(guī)則:相同位置均為0,那么結(jié)果就為0,否則為1”
示例:

結(jié)果:

“師弟,這個你能單獨畫張圖,解釋一下嗎?”
“沒問題,看我的”

“嗯嗯,沒錯沒錯,看來你已經(jīng)掌握精髓了”
“那,必須的”
6. ^
諸小亮:“最后一個:^(異或),規(guī)則:相同位置的值不同,那么結(jié)果就為1,否則為0”
示例:

結(jié)果:

“師兄,這個還交給我,你看看”

“完全正確,簡直不要太棒”諸小亮贊揚到
“過獎,過獎”
“下面給你說一個場景,使用 ^ 很方便,面試也有人問”
“哦?什么場景?”張小飛一下來了興致
“比如:交換兩個變量的值,你覺得應(yīng)該怎么做?”
“這太簡單了,代碼應(yīng)該是:”
結(jié)果:

“嗯,沒錯,你這樣確實能實現(xiàn),但是使用 ^ 會更加簡單,比如:”

結(jié)果:

“這就交換成功了?不是吧”
“沒錯,這就是 ^ 的強大之處,你根據(jù)之前的知識,好好研究一下吧,給你個提示:”
一個數(shù) 異或 同一個數(shù) 兩次,那么結(jié)果是它本身
“好的,好的,我這就看看”
6. 三元運算符
諸小亮:“來,還剩下最有一個運算符:三元運算符”
張小飛:“這又是什么東西?”
“非常簡單,格式:(條件表達式) ? 結(jié)果1:結(jié)果2;”
“嗯....,不懂”張小飛搖搖頭
“沒關(guān)系,看一段代碼你就明白了”
結(jié)果:
“師兄,我是這樣理解的:如果條件表達式的結(jié)果為 ture,那么就取 結(jié)果1,否則取 結(jié)果2”
“沒錯,是這樣的,那么關(guān)于運算符就這么多了,需要練習(xí)一會兒嗎?”
“當然了,這個東西還是挺多了”