天天看點

張小飛的Java之路——第四章

作者:小艾程式設計

寫在前面:

視訊是什麼東西,有看文檔精彩嗎?

視訊是什麼東西,有看文檔速度快嗎?

視訊是什麼東西,有看文檔效率高嗎?

1. 表達式

十分鐘後,兩人重新來到了書房。

諸小亮:“咱們繼續上課,首先來認識一下 表達式”

  • 表達式:就是資料的表達方式
    • 比如:int a = 2;那麼 a 就是 2 的表達方式,是以 a 就是表達式

張小飛:“a 不應該是辨別符嗎?怎麼又成表達式了”

“一樣的意思,隻是叫法不同而已,這樣定義後,隻要提到 a,我們就明白它代表的是 2 ”

“我明白了,這相當于給數字 2 起了個綽号”

“可以這樣認為,但并不是很準确,因為下面的也是表達式:”

public static void main(String[] args){
    int a = 2;
    
    //數字3的表示方式有很多種,比如:
    a + 1;// a+1 可以表示 3 ,是以 a+3 也是表達式
    
    1 + 2;// 1+2 也可以表示 3,是以它也是表達式
}           

諸小亮“總之:隻要能表示某個資料的代碼,都是表達式”

張小飛:“明白”

2. 運算符

諸小亮:“接着,我們說說 Java 中的運算符,畢竟計算機嘛,就是幫助人類做計算的”

張小飛:“不就是 加減乘除 嘛,這有什麼說的”

“這你就不懂了,加減乘除隻是最基本的,Java 中還有其他一些運算符,比如: %、++、-- 等,另外 Java 中的除法,跟我們平常中的除法也有點兒差別?”

“哦?這我倒是想見識一下,哪裡不一樣”

“不要着急,Java中的運算符分為好幾種,我們一個一個說”

1. 算數運算符

1. + 、-、*、/

諸小亮:“咱們先看 算數運算符,其實就是: + 、-、*、/

public  static void main (String  []  args)  {
    int a = 1 + 2;
    
    int b = a - 2;
    
    int c = b * 3;
    
    int d = c / 3;
}           

“由于代碼太簡單,結果我就不輸出了,給你 2 分鐘,你自己看看吧”

“師兄,您接着說吧,這麼簡單的東西,都不值得我動手”張小飛信心十足的說到

“好吧,上面的确實太簡單,不過需要注意一點:除法運算,看下面代碼:”

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“這是什麼情況,不應該輸出 2.5 嗎?”張小飛問到

“2.5 是數學上的結果,Java 中,整數之間做除法,結果中的小數部分會被舍棄”

張小飛:“但是這樣的結果不正确啊,怎麼能夠保留小數部分呢?”

諸小亮:“如果想保留小數部分,那麼就隻能:”

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“哦,明白了,我自己來試試”

“師兄,我好奇嘗試一下把除數弄成 0,怎麼會這樣子?”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

“這表示程式出問題了,不過我們還沒講到這裡,之後再說”

“好的,好的”

2. %:取模運算

張小飛:“這個 取模運算 是什麼意思?”

諸小亮:“其實就是兩個數相除,擷取餘數,比如:”

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

張小飛:“這個有點兒意思,我來試試”

“師兄,我用正數測試是沒問題的,但是用負數的話。。。,結果:”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

諸小亮:“這正是我要給你說的第二點:如果除數是負數,負号可以忽略不計”

張小飛:“那,如果被除數是負數呢?我再來試試”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

張小飛:“原來如此,如果被除數是負數,就不能忽略負号了”

諸小亮:“還有一種比較特殊的取模:被除數 比 除數 小,比如:”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

張小飛:“這個怎麼解釋?”

諸小亮:“1 % 5,商是0,餘數是1”

“哦...,明白了”

“還有一點需要記住:取模運算的結果,必然比除數小”

“這是當然,餘數嘛,肯定比除數小”

3. ++:自增運算符

諸小亮:“++運算符,表示自己加 1,比如:”

張小飛的Java之路——第四章

上圖中:a++ 相當于 a = a+1,結果:

張小飛的Java之路——第四章

張小飛:“。。。。,我還以為是很高深的東西呢,就這?”

“你想多了,不過下面的就有些難度,比如:前置運算”

“哦?什麼是前置運算?”張小飛興緻勃勃的問到

“把 ++ 放到變量的前面,這就叫:前置運算,比如:”

張小飛的Java之路——第四章

“。。。。。。,你真無聊”

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

張小飛的Java之路——第四章
張小飛的Java之路——第四章

“師兄,感覺還需要您解釋一下”

“沒問題,其實上面代碼的運算邏輯,實際是:”

  • 先執行 ++ 操作,是以 a = 2;
  • 然後把 a 的值賦給 b,是以 b = 2;

“明白,不過這也不難啊”

“稍等,讓我變形一下”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

“這...,怎麼會這樣呢?”張小飛疑惑道

“++ 放到變量後面,情況就不同了,這叫:後置運算,它的運算邏輯是這樣的:”

  • 先臨時記錄 a 的值,比如:int temp = a;
  • 然後執行 ++ 操作,是以 a = 2;
  • 最後把 temp 賦給 b,是以 b = 1;

“原來如此,我明白了”張小飛說道

4. --:自減運算

諸小亮:“--運算符,就是自己減 1,跟 ++ 類似,我就不介紹了,給你 5 分鐘,自己玩玩吧”

張小飛:“好的”

2. 指派運算符

五分鐘後。

諸小亮:“接下來是 指派運算”

張小飛:“師兄,指派不就是 = 号嗎,這還要單獨講?”

“指派運算符也有好幾個,= 隻是其中一個,還有:+=, -=, *=, /=, %=,你看看下面代碼:”

public static void main(String[] args){
    int a = 2;
    a += 3;//相當于 a = a + 3;
    a -= 1;//相當于 a = a - 3;
    a *= 2;//相當于 a = a * 3;
    a /= 2;//相當于 a = a / 3;
    a %= 5;//相當于 a = a % 3;
}           

“原來還可以這樣使用,我明白了”

“不過,需要明白,a += 3 跟 a = a + 3 還是有差別的,比如:”

張小飛的Java之路——第四章

“這是不是寫錯了,這個代碼編譯會報錯,s+3 是一個 int 類型的值,無法指派給 s ”

“你說的沒錯,但是改一下的話:”

張小飛的Java之路——第四章

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

張小飛的Java之路——第四章

張小飛疑惑道:“這是為什麼呢?”

“原因很簡單:+= 是指派運算符,如果兩邊的類型不一樣時會自動向低轉化,是以。。。。。”

“明白”

3. 比較運算符

諸小亮:“比較運算符也有好幾個:==、!=、>、>=、<、<=”

張小飛:“這個我知道,數學上也經常使用”

“沒錯,不過在 Java 中,比較運算符的結果都是 boolean 型,要麼是true,要麼是false,比如:”

public static void main(String[] args){
    boolean bool = 4 == 3;
    System.out.println(bool);
    System.out.println(4 != 3);
    System.out.println(4 > 3);
    System.out.println(4 >= 3);
    System.out.println(4 < 3);
    System.out.println(4 <= 3);
}           

結果:

張小飛的Java之路——第四章

“這個比較簡單,也沒什麼特殊的地方,看看就行”

“好的”

4. 邏輯運算符

諸小亮:“邏輯運算符,這個就複雜一些了”

張小飛:“師兄,你上面就說有難度,最後也沒發現難在哪兒了,别再忽悠了”

“咳咳,我說有難度了嗎,我說的是:它稍微複雜一些”諸小亮反駁道

“好好,是我聽錯了,您接着說”

“邏輯運算符,有 3 個:&&(且)、||(或)、!(非),咱們一個個解釋”

1. &&

諸小亮:“第一個:&&(且)”

  • 作用:連接配接兩個表達式,兩個表達式都為 true,結果才為 true,否則為 false

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

張小飛:“還得用 && 連起來,a<b<c 這樣寫不行嗎?”

“不行,Java 中确實不允許a<b<c 這種寫法 ”

“好吧”

“另外,還需要注意:使用 && 時,隻要第一個表達式的值是false,那麼整體就是false”

  • 上面的代碼:c < a && a < b,第一個c < a 是 false,是以整個表達式的值就是false
  • 後面 a < c 不會繼續判斷,也就是 a<c 這個代碼不會執行

“這個,可以證明一下嗎?”

“當然可以,修改一下代碼:”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

張小飛:“原來如此, 如果 a / 0 執行的話,就會報錯了”

2. ||

諸小亮:“第二個:||(或)”

  • 作用:連接配接兩個表達式,兩個表達式隻要有一個 true,結果就為 true

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“這等于跟 && 剛好相反嘛”張小飛說到

“是的,不過:如果第一個表達式結果為true,整體結果就為true,不用再執行第二個表達式”

“明白,跟 && 很類似”

3.!(非)

諸小亮:“第三個:!(非),這個更簡單”

  • 作用:對表達式的值取反,如果表達式的值是true,取反後,結果就是:false

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

5. 位運算符

諸小亮:“師弟,下面我們講位運算,這個是真有難度”

張小飛:“。。。。。”

“你不信?好,我們來看看,位運算:直接資料對二進制進行運算”

“二進制運算?什麼意思?”

1. <<

諸小亮:“<<:左移,一個數左移 N 位,相當于乘以 2 的 N 次方”

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

張小飛:“這個二進制又有什麼關系呢?”

“很簡單,我們先看數字 1 的二進制:”

張小飛的Java之路——第四章

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

張小飛的Java之路——第四章

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

張小飛的Java之路——第四章

張小飛:“原來是這樣,我明白了”

2. >>

諸小亮:“然後是 >> (右移)”

  • >>:右移,一個數右移 N 位,相當于除以 2 的 N 次方

張小飛:“明白,右移跟左移剛好相反”

“是的,不過在右移後,左邊會出現空位,這時:”

  • 如果是正數:左邊補0
  • 如果是負數:左邊補1

“師兄,不對啊,為什麼我這個右移後結果是0呢?”

張小飛的Java之路——第四章
張小飛的Java之路——第四章

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

張小飛的Java之路——第四章

“右移 1 位的結果:”

張小飛的Java之路——第四章

因為是正數,是以左側補 0 ,最終結果:

張小飛的Java之路——第四章

張小飛:“原來如此,懂了懂了”

3. >>>

張小飛:“師兄,>>> 這個也是右移?”

諸小亮:“是的,這個右移。。。”

“是不是右移 N 位,就相當于除以 3 的 N 次方? ”張小飛搶答道

“。。。。,不是的,它的含義是:>>>:無符号右移,不管是正數、負數,右移後,左邊統統補0”

“師弟,這個我就不詳細介紹了,你自己玩吧”

4. &

諸小亮:“接下來是 & (按位與)運算”

張小飛:“這不是 ‘且’ 嗎,怎麼又叫 ‘按位與’ 了?”

“。。。,你仔細看清楚,且是 ‘&&’,這裡是 ‘&’”

“哦哦,不好意思,看錯了,那這個具體是什麼意思?”

“也是對二進制做運算,規則是:相同位置都是1,那麼結果就為1,否則為0”

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“這個,嗯。。。,還得麻煩您解釋一下”張小飛說到

“怎麼樣,不是那麼簡單吧,給你個圖,先看看”

張小飛的Java之路——第四章

“明白了,關鍵就在于:相同位置都是1,那麼結果就為1,否則為0”

5. |

諸小亮:“師弟,這個要看清楚了,是 ‘|(按位或)’,可不是 ‘||’”

張小飛:“。。。,好啦好啦,這次看清了,趕緊說說是什麼意思吧”

“對二進制做 或 運算,規則:相同位置均為0,那麼結果就為0,否則為1”

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“師弟,這個你能單獨畫張圖,解釋一下嗎?”

“沒問題,看我的”

張小飛的Java之路——第四章

“嗯嗯,沒錯沒錯,看來你已經掌握精髓了”

“那,必須的”

6. ^

諸小亮:“最後一個:^(異或),規則:相同位置的值不同,那麼結果就為1,否則為0”

示例:

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

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

張小飛的Java之路——第四章

“完全正确,簡直不要太棒”諸小亮贊揚到

“過獎,過獎”

“下面給你說一個場景,使用 ^ 很友善,面試也有人問”

“哦?什麼場景?”張小飛一下來了興緻

“比如:交換兩個變量的值,你覺得應該怎麼做?”

“這太簡單了,代碼應該是:”

public  static void main (String  []  args)  {
    int a = 2;
    int b = 3;
    
    //交換 a 和 b 的值
    int temp = a;
    a = b;
    b = temp;
    System.out.println(a + "," +b);
}           

結果:

張小飛的Java之路——第四章

“嗯,沒錯,你這樣确實能實作,但是使用 ^ 會更加簡單,比如:”

張小飛的Java之路——第四章

結果:

張小飛的Java之路——第四章

“這就交換成功了?不是吧”

“沒錯,這就是 ^ 的強大之處,你根據之前的知識,好好研究一下吧,給你個提示:”

  • 一個數 異或 同一個數 兩次,那麼結果是它本身

“好的,好的,我這就看看”

6. 三元運算符

諸小亮:“來,還剩下最有一個運算符:三元運算符”

張小飛:“這又是什麼東西?”

“非常簡單,格式:(條件表達式) ? 結果1:結果2;”

“嗯....,不懂”張小飛搖搖頭

“沒關系,看一段代碼你就明白了”

public  static void main (String  []  args)  {
    int a = 2;
    int b = 3;
    
    //三元運算:如果 a<b 的結果是 true, 則設定 c 為100,否則設定為200
    int c = a < b ? 100 : 200;
    System.out.println(c);
}           

結果:

張小飛的Java之路——第四章

“師兄,我是這樣了解的:如果條件表達式的結果為 ture,那麼就取 結果1,否則取 結果2”

“沒錯,是這樣的,那麼關于運算符就這麼多了,需要練習一會兒嗎?”

“當然了,這個東西還是挺多了”