運算符優先級 - 1

“嗨,比拉博!”

“比拉博很高興迎接他的朋友!”

“今天 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;

if (!b)

如果 b 不為真,則 if 條件為真。
換句話說,如果  b 為 false,則結果為 true
int a = 2, b = 3, c = 4;

if (a < b && a < c)
if ((a < b) && (a < c))

如果 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;
=
*=, /=, %=
-=, +=
<<=. >>=, >>>=
&=, ^=. |=
最低優先級(最後執行)