寫在前面:
視訊是什麼東西,有看文檔精彩嗎?
視訊是什麼東西,有看文檔速度快嗎?
視訊是什麼東西,有看文檔效率高嗎?
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 分鐘,你自己看看吧”
“師兄,您接着說吧,這麼簡單的東西,都不值得我動手”張小飛信心十足的說到
“好吧,上面的确實太簡單,不過需要注意一點:除法運算,看下面代碼:”
結果:
“這是什麼情況,不應該輸出 2.5 嗎?”張小飛問到
“2.5 是數學上的結果,Java 中,整數之間做除法,結果中的小數部分會被舍棄”
張小飛:“但是這樣的結果不正确啊,怎麼能夠保留小數部分呢?”
諸小亮:“如果想保留小數部分,那麼就隻能:”
結果:
“哦,明白了,我自己來試試”
“師兄,我好奇嘗試一下把除數弄成 0,怎麼會這樣子?”
“這表示程式出問題了,不過我們還沒講到這裡,之後再說”
“好的,好的”
2. %:取模運算
張小飛:“這個 取模運算 是什麼意思?”
諸小亮:“其實就是兩個數相除,擷取餘數,比如:”
結果:
張小飛:“這個有點兒意思,我來試試”
“師兄,我用正數測試是沒問題的,但是用負數的話。。。,結果:”
諸小亮:“這正是我要給你說的第二點:如果除數是負數,負号可以忽略不計”
張小飛:“那,如果被除數是負數呢?我再來試試”
張小飛:“原來如此,如果被除數是負數,就不能忽略負号了”
諸小亮:“還有一種比較特殊的取模:被除數 比 除數 小,比如:”
張小飛:“這個怎麼解釋?”
諸小亮:“1 % 5,商是0,餘數是1”
“哦...,明白了”
“還有一點需要記住:取模運算的結果,必然比除數小”
“這是當然,餘數嘛,肯定比除數小”
3. ++:自增運算符
諸小亮:“++運算符,表示自己加 1,比如:”
上圖中:a++ 相當于 a = a+1,結果:
張小飛:“。。。。,我還以為是很高深的東西呢,就這?”
“你想多了,不過下面的就有些難度,比如:前置運算”
“哦?什麼是前置運算?”張小飛興緻勃勃的問到
“把 ++ 放到變量的前面,這就叫:前置運算,比如:”
“。。。。。。,你真無聊”
“哈哈,開個玩笑,下面的才真正能有難度,仔細看好:”
“師兄,感覺還需要您解釋一下”
“沒問題,其實上面代碼的運算邏輯,實際是:”
- 先執行 ++ 操作,是以 a = 2;
- 然後把 a 的值賦給 b,是以 b = 2;
“明白,不過這也不難啊”
“稍等,讓我變形一下”
“這...,怎麼會這樣呢?”張小飛疑惑道
“++ 放到變量後面,情況就不同了,這叫:後置運算,它的運算邏輯是這樣的:”
- 先臨時記錄 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 還是有差別的,比如:”
“這是不是寫錯了,這個代碼編譯會報錯,s+3 是一個 int 類型的值,無法指派給 s ”
“你說的沒錯,但是改一下的話:”
“這時候就可以編譯成功了,而且正常輸出”
張小飛疑惑道:“這是為什麼呢?”
“原因很簡單:+= 是指派運算符,如果兩邊的類型不一樣時會自動向低轉化,是以。。。。。”
“明白”
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);
}
結果:
“這個比較簡單,也沒什麼特殊的地方,看看就行”
“好的”
4. 邏輯運算符
諸小亮:“邏輯運算符,這個就複雜一些了”
張小飛:“師兄,你上面就說有難度,最後也沒發現難在哪兒了,别再忽悠了”
“咳咳,我說有難度了嗎,我說的是:它稍微複雜一些”諸小亮反駁道
“好好,是我聽錯了,您接着說”
“邏輯運算符,有 3 個:&&(且)、||(或)、!(非),咱們一個個解釋”
1. &&
諸小亮:“第一個:&&(且)”
- 作用:連接配接兩個表達式,兩個表達式都為 true,結果才為 true,否則為 false
示例:
結果:
張小飛:“還得用 && 連起來,a<b<c 這樣寫不行嗎?”
“不行,Java 中确實不允許a<b<c 這種寫法 ”
“好吧”
“另外,還需要注意:使用 && 時,隻要第一個表達式的值是false,那麼整體就是false”
- 上面的代碼:c < a && a < b,第一個c < a 是 false,是以整個表達式的值就是false
- 後面 a < c 不會繼續判斷,也就是 a<c 這個代碼不會執行
“這個,可以證明一下嗎?”
“當然可以,修改一下代碼:”
張小飛:“原來如此, 如果 a / 0 執行的話,就會報錯了”
2. ||
諸小亮:“第二個:||(或)”
- 作用:連接配接兩個表達式,兩個表達式隻要有一個 true,結果就為 true
示例:
結果:
“這等于跟 && 剛好相反嘛”張小飛說到
“是的,不過:如果第一個表達式結果為true,整體結果就為true,不用再執行第二個表達式”
“明白,跟 && 很類似”
3.!(非)
諸小亮:“第三個:!(非),這個更簡單”
- 作用:對表達式的值取反,如果表達式的值是true,取反後,結果就是:false
示例:
結果:
5. 位運算符
諸小亮:“師弟,下面我們講位運算,這個是真有難度”
張小飛:“。。。。。”
“你不信?好,我們來看看,位運算:直接資料對二進制進行運算”
“二進制運算?什麼意思?”
1. <<
諸小亮:“<<:左移,一個數左移 N 位,相當于乘以 2 的 N 次方”
示例:
結果:
張小飛:“這個二進制又有什麼關系呢?”
“很簡單,我們先看數字 1 的二進制:”
“左移 1 位,就是把所有二進制向左邊移動一個位置,結果:”
“這樣,左邊做高位的 0 就會超出 int 的邊界,也就舍棄掉了,不過最右邊也會出現一個空位,這時進行補 0 操作,最後結果:”
張小飛:“原來是這樣,我明白了”
2. >>
諸小亮:“然後是 >> (右移)”
- >>:右移,一個數右移 N 位,相當于除以 2 的 N 次方
張小飛:“明白,右移跟左移剛好相反”
“是的,不過在右移後,左邊會出現空位,這時:”
- 如果是正數:左邊補0
- 如果是負數:左邊補1
“師兄,不對啊,為什麼我這個右移後結果是0呢?”
諸小亮微微一笑:“我們再來回憶一下,1 的二進制”
“右移 1 位的結果:”
因為是正數,是以左側補 0 ,最終結果:
張小飛:“原來如此,懂了懂了”
3. >>>
張小飛:“師兄,>>> 這個也是右移?”
諸小亮:“是的,這個右移。。。”
“是不是右移 N 位,就相當于除以 3 的 N 次方? ”張小飛搶答道
“。。。。,不是的,它的含義是:>>>:無符号右移,不管是正數、負數,右移後,左邊統統補0”
“師弟,這個我就不詳細介紹了,你自己玩吧”
4. &
諸小亮:“接下來是 & (按位與)運算”
張小飛:“這不是 ‘且’ 嗎,怎麼又叫 ‘按位與’ 了?”
“。。。,你仔細看清楚,且是 ‘&&’,這裡是 ‘&’”
“哦哦,不好意思,看錯了,那這個具體是什麼意思?”
“也是對二進制做運算,規則是:相同位置都是1,那麼結果就為1,否則為0”
示例:
結果:
“這個,嗯。。。,還得麻煩您解釋一下”張小飛說到
“怎麼樣,不是那麼簡單吧,給你個圖,先看看”
“明白了,關鍵就在于:相同位置都是1,那麼結果就為1,否則為0”
5. |
諸小亮:“師弟,這個要看清楚了,是 ‘|(按位或)’,可不是 ‘||’”
張小飛:“。。。,好啦好啦,這次看清了,趕緊說說是什麼意思吧”
“對二進制做 或 運算,規則:相同位置均為0,那麼結果就為0,否則為1”
示例:
結果:
“師弟,這個你能單獨畫張圖,解釋一下嗎?”
“沒問題,看我的”
“嗯嗯,沒錯沒錯,看來你已經掌握精髓了”
“那,必須的”
6. ^
諸小亮:“最後一個:^(異或),規則:相同位置的值不同,那麼結果就為1,否則為0”
示例:
結果:
“師兄,這個還交給我,你看看”
“完全正确,簡直不要太棒”諸小亮贊揚到
“過獎,過獎”
“下面給你說一個場景,使用 ^ 很友善,面試也有人問”
“哦?什麼場景?”張小飛一下來了興緻
“比如:交換兩個變量的值,你覺得應該怎麼做?”
“這太簡單了,代碼應該是:”
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);
}
結果:
“嗯,沒錯,你這樣确實能實作,但是使用 ^ 會更加簡單,比如:”
結果:
“這就交換成功了?不是吧”
“沒錯,這就是 ^ 的強大之處,你根據之前的知識,好好研究一下吧,給你個提示:”
- 一個數 異或 同一個數 兩次,那麼結果是它本身
“好的,好的,我這就看看”
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);
}
結果:
“師兄,我是這樣了解的:如果條件表達式的結果為 ture,那麼就取 結果1,否則取 結果2”
“沒錯,是這樣的,那麼關于運算符就這麼多了,需要練習一會兒嗎?”
“當然了,這個東西還是挺多了”