Ưu tiên toán tử - 1

"Chào, Bilaabo!"

"Bilaabo rất vui được chào đón người bạn của mình!"

"Hôm nay Bilaabo sẽ cho bạn biết về quyền ưu tiên của toán tử. Nhưng trước tiên, anh ấy sẽ cho bạn biết về chính các toán tử."

"Những toán tử mà bạn nói đến là gì?"

"Thực ra, bạn đã quen thuộc với họ. Bạn có thể không biết họ được gọi là người điều hành."

"Ví dụ, giả sử chúng ta có biểu thức  c = a + b; "

"Nó có hai toán tử: toán tử cộng và toán tử gán."

"Nói cách khác, các toán tử chỉ là các ký hiệu toán học? Giống như phép nhân, phép chia và phép cộng?"

"Vâng, đó là sự thật. Tuy nhiên, có sự khác biệt."

"Tôi sẽ không định nghĩa các toán tử cho bạn: một định nghĩa sẽ không giúp bạn thông minh hơn. Tốt hơn là nên xem chúng hoạt động. Các toán tử có thể được chia thành nhiều nhóm và chúng ta sẽ xem xét chúng ngay bây giờ."

1) " Các toán tử toán học "

Biểu tượng Ví dụ Tên Mô tả (những gì nó làm)
+ a + b Toán tử cộng Toán tử cộng.
- c - d Toán tử trừ Trừ số thứ hai từ số thứ nhất.
* a * t toán tử nhân Nhân hai số.
/ a / b nhà điều hành bộ phận Chia số thứ nhất cho số thứ hai.
% c % d Chia số thứ nhất cho số thứ hai. Tính số dư sau khi chia số thứ nhất cho số thứ hai.
- -a trừ một ngôi Thay đổi dấu của biến thành ngược lại.
Cộng thành trừ, và trừ thành cộng.
+ +a cộng một ngôi Không thay đổi bất cứ điều gì. Điều này đã được thêm vào để bổ sung cho toán tử trừ một ngôi. Nó chỉ dành cho vẻ bề ngoài.

"Tôi nhận ra những thứ này từ trường học. Chương trình cơ sở của tôi bao gồm các khóa học ở trường."

"Nhưng, có chuyện gì với dấu phần trăm đó, một loại ma thuật nào đó?"

"Đó là toán tử " dư sau phép chia ". Nếu 11 chia cho 5 thì ta được 2 và dư 1. 1 này có thể nhận được bằng cách viết 11 % 5;"

"Khi bạn chia các số nguyên trong Java, kết quả cũng là một số nguyên. Phần còn lại từ phép chia đơn giản là bị bỏ qua. Nếu chúng ta chia 8 cho 5, chúng ta sẽ nhận được 1."

Sự biểu lộ Kết quả
19 / 10 1 Nếu chúng ta chia 19 cho 10, kết quả là 1 với số dư là 9.
19 % 10 9 Nếu chúng ta chia 19 cho 10, kết quả là 1 với số dư là 9.
2 / 5 0 Nếu chúng ta chia 2 cho 5,  kết quả là 0 với số dư là 2.
16 % 2 0 Nếu chúng ta chia 16 cho 2, kết quả là 8 với phần còn lại là 0.

“Nhưng chúng ta cần phần còn lại để làm cái quái gì vậy?”

"Giả sử bạn cần kiểm tra xem một số nguyên có chẵn không. Sau đó, bạn có thể viết:"

if (a % 2 == 0)

"Và nếu bạn cần kiểm tra xem b có lẻ không, thì bạn có thể viết:"

if (b % 2 == 1)

"Hoặc để kiểm tra xem d có chia hết cho 3 hay không:"

if (d % 3 == 0)

"Thật thú vị. Tôi sẽ nhớ điều đó."

2)  " Toán tử so sánh "

Biểu tượng Ví dụ Tên Mô tả (những gì nó làm)
< a < b Ít hơn Kiểm tra xem a có nhỏ hơn b không.
<= c <= d Ít hơn hoặc bằng Kiểm tra xem c có nhỏ hơn hoặc bằng d không.
> a > b Lớn hơn Kiểm tra xem a có lớn hơn b không.
>= c >= d Lớn hơn hoặc bằng Kiểm tra xem c có lớn hơn hoặc bằng d không.
== i == j bằng Kiểm tra xem i có bằng j không.
!= a != 0 không bằng Kiểm tra xem a có khác 0 không.

"Tôi đã sử dụng tất cả những thứ này."

"Và sự khác biệt chính giữa các toán tử này và các toán tử toán học là gì?"

"Nếu chúng ta thêm hai số, chúng ta sẽ nhận được một số; nhưng, nếu chúng ta so sánh hai số, chúng ta sẽ nhận được đúng hoặc sai."

"Đúng vậy. Kết quả của phép so sánh là một giá trị " giá trị logic ", như bạn biết, được biểu thị bằng kiểu boolean. Có hai khả năng: đúng hoặc sai.

"Ừ, rõ ràng rồi. Tôi biết rồi."

3) " Các toán tử logic "

Biểu tượng Ví dụ Tên Mô tả (những gì nó làm)
&& a && b Kết quả của biểu thức chỉ đúng khi cả a và b đều đúng.
|| c || d HOẶC Kết quả của biểu thức là đúng nếu a hoặc b đúng. Cả hai hoặc ít nhất một.
! !a KHÔNG Kết quả của biểu thức chỉ đúng nếu a sai.

"Các toán tử logic chỉ có thể được sử dụng với các biến hoặc biểu thức boolean."

Ví dụ Sự miêu tả
boolean a = true;
boolean b = true;if (a && b)
Điều kiện if là đúng nếu cả hai giá trị đều đúng
Nói cách khác, nếu cả a và b đều đúng, thì kết quả là đúng .
boolean a = true;
boolean b = false;if (a || b)
Điều kiện if là true nếu ít nhất một giá trị là true
Nói cách khác, nếu a hoặc b là true thì kết quả là true .
boolean b = false;

if (!b)

Điều kiện if đúng nếu b không đúng.
Nói cách khác, nếu   b là false thì kết quả là  true .
int a = 2, b = 3, c = 4;

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

Nếu a nhỏ hơn b và a nhỏ hơn c, thì kết quả của biểu thức là đúng.
a, b, c là các số nguyên, nhưng kết quả so sánh các số nguyên là một giá trị logic (true, false), nghĩa là chúng ta có thể sử dụng các toán tử logic.

"Tôi biết tất cả những điều này rồi."

"Thật sao? Vậy thì tiếp tục nào."

4) " Toán tử theo bit "

Biểu tượng Ví dụ Tên Mô tả (những gì nó làm)
& a & b Bitwise AND
| c | d HOẶC Bitwise HOẶC
~ ~a KHÔNG Bitwise KHÔNG
^ a ^ b XOR Bitwise "ĐỘC QUYỀN HOẶC"

" Toán tử theo bit thực hiện thao tác từng bit trên số nguyên."

"Đó là cái gì?"

"Mỗi số được biểu diễn dưới dạng một tập hợp các bit và sau đó kết quả được tính như sau:"

"Nếu bit đầu tiên của cả hai số là 1, thì bit đầu tiên của kết quả sẽ là 1."

"Nếu bit thứ hai của cả hai số là 1, thì bit thứ hai của kết quả sẽ là 1. Và cứ thế."

"Điều đó có đúng với tất cả các toán tử bitwise không?"

"Nó đơn giản hơn thế nhiều. Một bit chỉ có thể có hai giá trị, 0 và 1, phải không?"

"Phải."

"Sau đó, coi 1 là đúng và 0 là sai. Các thao tác trên các bit riêng lẻ sau đó sẽ gần giống với các thao tác logic:"

biểu thức logic biểu thức bitwise
đúng && đúng == đúng 1&1 == 1
đúng && sai == sai 1&0 == 0
thật || đúng == đúng 1|1 == 1
thật || sai == đúng 1|0 == 1
sai || sai = sai 0|0 == 0
!false == true ~0 == 1
!đúng == sai ~1 == 0

"Ồ! Thật dễ dàng."

"Vâng, đừng quên rằng các hoạt động theo bit sử dụng các bit tương ứng từ hai số."

"Vâng, tôi nhớ: bit đầu tiên của một số được ghép nối với bit đầu tiên của số thứ hai và kết quả cũng được ghi vào bit đầu tiên. Và điều tương tự cũng xảy ra với các bit còn lại."

"Đúng vậy. Anh còn câu hỏi nào khác không?"

"Chuyện gì xảy ra với XOR và 'độc quyền hoặc'?"

"Đó là một miếng bánh: khi các giá trị khác nhau, đó là sự thật; khi chúng giống nhau, nó là sai."

biểu thức logic biểu thức bitwise
đúng XOR đúng == sai 1 ^ 1 == 0
sai XOR sai == sai 0 ^ 0 == 0
đúng XOR sai == đúng 1 ^ 0 == 1
sai XOR đúng == đúng 0 ^ 1 == 1

Dưới đây là một vài ví dụ khác về hoạt động bitwise:

Ví dụ Số dưới dạng bit Kết quả dưới dạng bit Kết quả
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

"Cảm ơn, Bilaabo. Giờ thì tôi biết rồi."

"Có thêm một nhóm toán tử theo bit, toán tử dịch chuyển:"

5) " Toán tử dịch chuyển "

Biểu tượng Ví dụ Tên Mô tả (những gì nó làm)
>> a >> b dịch chuyển phải Dịch chuyển các bit của số a sang phải b chữ số.
<< c << d dịch trái Dịch chuyển các bit của số c sang trái d chữ số.
>>> a >>> 2 dịch chuyển phải không dấu Dịch chuyển các bit của số a sang phải 2 chữ số.

"Đây là loại ảo thuật đường phố gì vậy?"

"Thực ra tất cả đều rất đơn giản. Hãy xem thử:"

Ví dụ Số dưới dạng bit Kết quả dưới dạng bit Kết quả
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

"Dịch chuyển các bit của một số sang trái 1 cũng giống như nhân số đó với 2. Dịch chuyển hai chữ số tương đương với phép nhân với 4, ba chữ số — nhân với 8, v.v."

"Dịch chuyển sang phải tương ứng với phép chia cho 2, 4, 8, 16, v.v."

"Nhưng sự khác biệt giữa các toán tử >>> và >> là gì?"

"Chúng khác nhau khi làm việc với các số âm. Điều này là do  các số có dấu sử dụng bit ngoài cùng bên trái để biểu thị dấu. Do đó, một số âm không còn là số âm khi dịch chuyển sang phải. Vì vậy, họ đã đưa ra hai toán tử khác nhau. Kiểm tra nó ra:"

Sự biểu lộ Kết quả Sự miêu tả
1 000 1010 >> 1 11 000 101 Số âm vẫn là số âm.
Đối với các số âm, các bit đến được lấp đầy bằng 1 giây.
1 000 1010 >> 2 111 000 10
1 000 1010 >> 3 1111 000 1
1 000 1010 >>> 1 01 000 101 Số âm không còn âm nữa. Đối với các số âm, các bit đến được lấp đầy bằng 0.
1 000 1010 >>> 2 001 000 10
1 000 1010 >>> 3 0001 000 1

"Sự thay đổi không theo chu kỳ. Các bit di chuyển ra ngoài cạnh trái hoặc phải của số chỉ đơn giản là bị loại bỏ."

6) " Toán tử gán "

"Tôi đã biết nhiệm vụ là gì. Nhưng tại sao bạn lại nói 'người vận hành'?"

"Bởi vì có một vài trong số họ ☺"

Nhà điều hành nó có nghĩa là gì
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;

"Tôi nghĩ rằng bạn có được logic."

7) " Toán tử tăng và giảm "

ký hiệu Ví dụ Sự miêu tả
++ a++;
++b;
Tăng số lên 1.
-- d--;
--i;
Giảm số hoặc biến đi 1.

"Có sự khác biệt giữa việc đặt hai dấu trừ trước hoặc sau biến không?"

"Vâng, có, mặc dù không lớn lắm. Nếu một biến với một trong các toán tử này là một phần của biểu thức hoặc phép gán, thì sẽ có sự khác biệt. Tôi muốn cho bạn thấy bằng ví dụ:"

Ví dụ Điều gì thực sự xảy ra Sự miêu tả
int a = 3;
int b = ++a;
int a = 3;
a = a + 1;
int b = a;
a đầu tiên được tăng lên 1, sau đó nó được sử dụng trong biểu thức.
int a = 3;
int b = a++;
int a = 3;
int b = a;
a = a + 1;
a được sử dụng đầu tiên trong biểu thức, sau đó tăng thêm 1.
int a = 3;
return a++;
int a = 3;
int result = a;
a = a + 1;
return result;
Hàm sẽ trả về 3, nhưng giá trị của a sẽ tăng thêm 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;
Kết quả ở đây là 13. Đầu tiên, x sẽ tăng thêm 1 và giá trị này sẽ thay thế số hạng đầu tiên, sau đó x sẽ lại tăng thêm 1.

"Chà! Thật tuyệt!"

"Tôi rất vui vì bạn thích nó. Nhưng, nếu không có biểu hiện hay nhiệm vụ nào, thì không có gì khác biệt:"

"x++ tương đương với x = x + 1."

"++x tương đương với x = x + 1."

"Tôi sẽ ghi nhớ điều đó. Cảm ơn, Bilaabo."

8)  " Toán tử bậc ba "

"Toán tử này không chỉ sử dụng một hoặc hai biến hoặc biểu thức. Nó sử dụng ba biến hoặc biểu thức cùng một lúc:"

ký hiệu Mã tương đương:
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;

"Chà, thật là tiện lợi."

"Vâng. Và nó nhỏ gọn và mã có thể đọc được. Hãy tận hưởng việc sử dụng nó!"

9) " Khác "

"Cho dù bộ sưu tập nhạc của bạn được tổ chức tốt đến đâu, bạn vẫn phải tạo một thư mục" Khác "."

"Vâng, bất cứ ai từng phải phân loại âm nhạc sẽ hoàn toàn đồng ý."

"Vì vậy, có ba toán tử nữa mà tôi muốn nói với bạn:"

ký hiệu Ví dụ Sự miêu tả
() (a + b) * c Dấu ngoặc đơn tăng mức độ ưu tiên của toán tử.
Những thứ trong ngoặc đơn được thực hiện đầu tiên.
[] c [i] = c [i + 1]; Lấy phần tử mảng theo chỉ số.
. int n = a.length; " Toán tử dấu chấm " truy cập các biến và phương thức của đối tượng.

"Và, cuối cùng, đây là bảng tóm tắt quyền ưu tiên của toán tử:"

nhà điều hành ví dụ
Ưu tiên cao nhất (các toán tử được thực thi theo thứ tự của chúng trong bảng này)
()
[]
.
(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;
=
*=, /=, %=
-=, +=
<<=. >>=, >>>=
&=, ^=. |=
Ưu tiên thấp nhất (thực hiện cuối cùng)