
“嗨,比拉博!”
“比拉博很高興迎接他的朋友!”
“今天 Bilaabo 將告訴您有關運算符優先級的信息。但首先他會告訴您有關運算符本身的信息。”
“你說的這些操作員是什麼?”
“其實你已經很熟悉了,只是你可能不知道他們叫操作員。”
“例如,假設我們有表達式 c = a + b; ”
“它有兩個運算符:一個加法運算符和一個賦值運算符。”
“也就是說,運算符就是數學符號?就像乘法、除法、加法一樣?”
“是的,的確如此。不過,還是有區別的。”
“我不會為你定義運算符:一個定義不會讓你更聰明。最好是看到它們的作用。運算符可以分為幾組,我們現在將對其進行研究。”
1) “數學運算符”
象徵 | 例子 | 姓名 | 描述(它做什麼) |
---|---|---|---|
+ |
a + b |
加法運算符 | 加法運算符。 |
- |
c - d |
減法運算符 | 從第一個數中減去第二個數。 |
* |
a * t |
乘法運算符 | 將兩個數字相乘。 |
/ |
a / b |
除法運算符 | 將第一個數字除以第二個數字。 |
% |
c % d |
將第一個數字除以第二個數字。 | 計算第一個數字除以第二個數字後的餘數。 |
- |
-a |
一元減號 | 將變量的符號更改為相反的符號。 加到減,減到加。 |
+ |
+a |
一元加號 | 沒有任何改變。這是為了補充一元減號運算符而添加的。就是為了好看 |
“我在學校認得這些。我的固件包括學校課程。”
“但是,那個百分號是怎麼回事,是某種魔法嗎?”
“就是‘除後餘數’運算符,11除以5,則得到2和1的餘數,這個1可以寫成11 % 5;”
“當你在 Java 中除以整數時,結果也是一個整數。除法運算的餘數被簡單地忽略。如果我們用 8 除以 5,我們得到 1。”
表達 | 結果 | |
---|---|---|
19 / 10 |
1個 | 如果我們用 19 除以 10,結果是 1,餘數是 9。 |
19 % 10 |
9 | 如果我們用 19 除以 10,結果是 1,餘數是 9。 |
2 / 5 |
0 | 如果我們將 2 除以 5,則 結果為 0,餘數為 2。 |
16 % 2 |
0 | 如果我們將 16 除以 2,則結果為 8,餘數為0。 |
“但我們到底要剩下的錢幹什麼?”
“假設你需要檢查一個整數是否為偶數。那麼你可以這樣寫:”
if (a % 2 == 0)
“如果你需要檢查 b 是否奇數,那麼你可以這樣寫:”
if (b % 2 == 1)
“或者檢查 d 是否可以被 3 整除:”
if (d % 3 == 0)
“很有趣。我會記住的。”
2) “比較運算符”
象徵 | 例子 | 姓名 | 描述(它做什麼) |
---|---|---|---|
< |
a < b |
少於 | 檢查 a 是否小於 b。 |
<= |
c <= d |
小於或等於 | 檢查 c 是否小於或等於 d。 |
> |
a > b |
比...更棒 | 檢查a是否大於b。 |
>= |
c >= d |
大於或等於 | 檢查 c 是否大於或等於 d。 |
== |
i == j |
等於 | 檢查 i 是否等於 j。 |
!= |
a != 0 |
不等於 | 檢查 a 是否不等於零。 |
“這些我都用過了。”
“這些運算符和數學運算符之間的主要區別是什麼?”
“如果我們將兩個數字相加,我們會得到一個數字;但是,如果我們比較兩個數字,我們會得出真或假。”
“沒錯,比較的結果是一個‘邏輯值’值,正如你所知,它是由布爾類型表示的。有兩種可能:真或假。
“是的,一切都清楚了。我已經知道了。”
3) “邏輯運算符”
象徵 | 例子 | 姓名 | 描述(它做什麼) |
---|---|---|---|
&& |
a && b |
和 | 只有當 a 和 b 都為真時,表達式的結果才為真。 |
|| |
c || d |
或者 | 如果 a 或 b 為真,則表達式的結果為真。他們兩個或至少一個。 |
! |
!a |
不是 | 僅當 a 為假時,表達式的結果才為真。 |
“邏輯運算符只能與布爾變量或表達式一起使用。”
例子 | 描述 |
---|---|
boolean a = true; boolean b = true;if (a && b) |
如果兩個值都為真,則 if 條件為真 換句話說,如果a 和 b都為真,則結果為真。 |
boolean a = true; boolean b = false;if (a || b) |
如果至少有一個值為真,則 if 條件為真 換句話說,如果a 或 b為真,則結果為真。 |
boolean b = false;
|
如果 b 不為真,則 if 條件為真。 換句話說,如果 b 為 false,則結果為 true。 |
int a = 2, b = 3, c = 4;
|
如果 a 小於 b 且 a 小於 c,則表達式的結果為真。 a、b、c都是整數,但是整數比較的結果是一個邏輯值(true,false),這意味著我們可以使用邏輯運算符。 |
“這一切我都知道了。”
“是嗎?那我們繼續吧。”
4) “按位運算符”
象徵 | 例子 | 姓名 | 描述(它做什麼) |
---|---|---|---|
& |
a & b |
和 | 按位與 |
| |
c | d |
或者 | 按位或 |
~ |
~a |
不是 | 按位非 |
^ |
a ^ b |
異或 | 按位“異或” |
“按位運算符對整數執行逐位運算。”
“那是什麼?”
“每個數字都表示為一組位,然後計算結果如下:”
“如果兩個數的第一位都是 1,那麼結果的第一位就是 1。”
“如果兩個數的第二位都是1,那麼結果的第二位就是1,以此類推。”
“所有按位運算符都是這樣嗎?”
“比這簡單多了,一個位只能有兩個值,0和1,對吧?”
“正確的。”
“然後將 1 視為真,將 0 視為假。對各個位的操作將與邏輯操作幾乎相同:”
邏輯表達式 | 按位表達式 |
---|---|
真 && 真 == 真 | 1&1 == 1 |
真 && 假 == 假 | 1&0 == 0 |
真|| 真 == 真 | 1|1 == 1 |
真|| 假 == 真 | 1|0 == 1 |
假 || 假 = 假 | 0|0 == 0 |
!假 == 真 | ~0 == 1 |
!true == false | ~1 == 0 |
“哦!那太容易了。”
“是的,只是不要忘記按位運算使用兩個數字中的相應位。”
“是的,我記得:一個數的第一位與第二位的第一位配對,結果也寫入第一位。其餘位也一樣。”
“對了,你還有什麼問題嗎?”
“XOR 和‘異或’有什麼關係?”
“這是小菜一碟:當值不同時,它是真的;當它們相同時,它是假的。”
邏輯表達式 | 按位表達式 |
---|---|
真 XOR 真 == 假 | 1 ^ 1 == 0 |
假 XOR 假 == 假 | 0 ^ 0 == 0 |
真 XOR 假 == 真 | 1 ^ 0 == 1 |
假 XOR 真 == 真 | 0 ^ 1 == 1 |
以下是按位運算的更多示例:
例子 | 數字作為位 | 結果為位 | 結果 |
---|---|---|---|
5 & 3 |
0000010 1 & 0000001 1 | 0000000 1 | 1個 |
7 & 2 |
000001 1 1 & 000000 1 0 | 00000010 | 2個 |
5 | 9 |
00000 1 0 1 | 0000 1 00 1 | 00001101 | 13 |
5 ^ 9 |
00000 101 ^ 00001001 | 0000 1100 | 12 |
~9 |
~ 00001001 | 11110110 | 246 |
“謝謝你,Bilaabo。現在我知道了。”
“還有一組按位運算符,即移位運算符:”
5) “移位運算符”
象徵 | 例子 | 姓名 | 描述(它做什麼) |
---|---|---|---|
>> |
a >> b |
右移 | 將數字 a 的位向右移動 b 位。 |
<< |
c << d |
左移 | 將數字 c 的位向左移動 d 位。 |
>>> |
a >>> 2 |
無符號右移 | 將數字 a 的位向右移動 2 位。 |
“這是什麼街頭魔術?”
“實際上一切都非常簡單。檢查一下:”
例子 | 數字作為位 | 結果為位 | 結果 |
---|---|---|---|
10 >> 1 |
0000 101 0 >> 1 | 00000 101 | 5個 |
10 >> 2 |
0000 101 0 >> 2 | 000000 10 | 2個 |
10 << 1 |
0000 101 0 << 1 | 000 101 00 | 20 |
10 << 2 |
0000 101 0 << 2 | 00 101 000 | 40 |
“將數字的位向左移動 1 與將數字乘以 2 相同。移動兩位相當於乘以 4,乘以三位 - 乘以 8,依此類推。”
“右移對應除以 2、4、8、16 等。”
“但是 >>> 和 >> 運算符之間有什麼區別?”
“他們在處理負數時有所不同。這是因為 帶符號的數字使用最左邊的位來表示符號。結果,負數向右移動時不再是負數。因此,他們想出了兩個不同的運算符。一探究竟:”
表達 | 結果 | 描述 |
---|---|---|
1 000 1010 >> 1 | 11 000 101 | 負數保持負數。 對於負數,傳入的位用 1 填充。 |
1 000 1010 >> 2 | 111 000 10 | |
1 000 1010 >> 3 | 1111 000 1 | |
1 000 1010 >>> 1 | 01 000 101 | 負數不再是負數。對於負數,傳入的位用 0 填充。 |
1 000 1010 >>> 2 | 001 000 10 | |
1 000 1010 >>> 3 | 0001 000 1 |
“移位不是循環的。超出數字左邊緣或右邊緣的位將被簡單地丟棄。”
6) “賦值運算符”
“我已經知道賦值是什麼了。但為什麼要說‘操作員’呢?”
“因為他們有好幾個☺”
操作員 | 這是什麼意思 |
---|---|
a += b; |
a = a + b; |
a -= b; |
a = a - b; |
a *= b; |
a = a * b; |
a %= b; |
a = a % b; |
a |= b; |
a = a | b; |
a &= b; |
a = a & b; |
“我想你明白邏輯了。”
7)《自增自減運算符》
符號 | 例子 | 描述 |
---|---|---|
++ |
a++; ++b; |
將數字增加 1。 |
-- |
d--; --i; |
將數字或變量減 1。 |
“將兩個減號放在變量之前或之後有區別嗎?”
“是的,雖然不是很大。如果具有這些運算符之一的變量是表達式或賦值的一部分,那麼就會存在差異。我寧願通過示例向您展示:”
例子 | 到底發生了什麼 | 描述 |
---|---|---|
int a = 3; int b = ++a; |
int a = 3; a = a + 1; int b = a; |
a先加1,然後用在表達式中。 |
int a = 3; int b = a++; |
int a = 3; int b = a; a = a + 1; |
a先用在表達式中,然後加1。 |
int a = 3; return a++; |
int a = 3; int result = a; a = a + 1; return result; |
該函數將返回 3,但 a 的值將增加 1。 |
int x = 5; x = ++x + ++x; |
int x = 5; int a = x + 1;// The first term is 6 x = a; int b = x + 1;// The second term is 7 x = b; x = a + b; |
這裡的結果是 13。首先,x 會增加 1,這個值會替換第一項,然後 x 會再次增加 1。 |
“哇!太酷了!”
“我很高興你喜歡它。但是,如果沒有表達或分配,那麼就沒有區別:”
“x++ 等同於 x = x + 1。”
“++x 等同於 x = x + 1。”
“我會記住的。謝謝,Bilaabo。”
8) “三元運算符”
“這個運算符不只是使用一個或兩個變量或表達式。它同時使用三個變量或表達式:”
符號 | 等效代碼: |
---|---|
a ? b : c; |
if (a) b else c |
int min = a < b ? a : b; |
if (a < b) min = a; else min = b; |
return a != null ? a.length : 0; |
if (a != null) return a.length; else return 0; |
“嗯,超級方便。”
“是的。而且它很緊湊,代碼可讀。喜歡使用它!”
9) “其他”
“無論您的音樂收藏整理得多麼好,您仍然必須創建一個“雜項”文件夾。”
“是的,任何曾經對音樂進行分類的人都會完全同意。”
“那麼,我還要給大家介紹三個乾員:”
符號 | 例子 | 描述 |
---|---|---|
() |
(a + b) * c |
括號增加運算符的優先級。 括號裡的東西先執行。 |
[] |
c [i] = c [i + 1]; |
通過索引獲取數組元素。 |
. |
int n = a.length; |
“點運算符”訪問對象的變量和方法。 |
“最後,這是一張總結運算符優先級的表格:”
運營商 | 例子 |
---|---|
最高優先級(運算符根據其在此表中的順序執行) | |
() [] . |
(a + b) c [i] = c [i] + 1 |
++ -- ~ ! + - |
i++; ++i; --j; a--; ~c !f return +a; return -a; |
* / % |
a * b c / d a % b |
+ - |
a + b c - d String s = "count"+"35"; |
>> << >>> |
a >> 3 b << 2 c >>> 3 |
< <= > >= |
a < b a <= b c > b c >= b |
== != |
a == 3 a != 0 |
& |
a & 7 |
^ |
a ^ b |
| |
a | b |
&& |
(a < b) && (a < c) |
|| |
(b != 0) || (c != 0) |
? : = |
a > 0 ? a : -a; |
= *=, /=, %= -=, += <<=. >>=, >>>= &=, ^=. |= |
|
最低優先級(最後執行) |
GO TO FULL VERSION