1. Phép toán Boolean
Các toán tử |
và &
có thể được áp dụng không chỉ cho các số mà còn cho các biểu thức boolean.
Nhưng, như bạn đã biết, có &&
và ||
toán tử. Tại sao chúng ta sẽ sử dụng |
instead of ||
, và &
thay vì &&
? Có bất kỳ điểm nào cho điều này? Có vẻ như là có. Thỉnh thoảng.
Các toán tử logic ||
và &&
logic được thực thi từ trái sang phải theo cái gọi là nguyên tắc lười biếng .
(expression1) || (expression2) || (expression3)
Nếu expression1
bằng true
, thì không có điểm nào để đánh giá expression2
và expression3
: kết quả sẽ true
bất kể.
Theo đó, khi đánh giá các biểu thức (chúng được đánh giá từ trái sang phải), ngay sau khi chúng tôi nhận được true
, việc đánh giá các biểu thức còn lại sẽ bị bỏ qua . Và nếu expression2
và expression3
bao gồm các cuộc gọi phương thức, các phương thức này sẽ không được gọi !
Điều tương tự cũng xảy ra với &&
toán tử logic:
(expression1) && (expression2) && (expression3)
Nếu expression1
bằng false
, thì không có điểm nào để đánh giá expression2
và expression3
: kết quả sẽ false
bất kể.
Đây là một thực tế quan trọng cho phép bạn viết những thứ như:
String s = null;
if (s != null && s.length() > 0) {
Ví dụ trên sẽ không bao giờ cho bạn một NullPulumException , bởi vì s.length()
sẽ chỉ được thực thi nếu phần đầu tiên s! = null
là true
.
Nếu s
bằng null
, phần bên trái của &&
toán tử là false
, thì kết quả của toàn bộ biểu thức boolean là false
, vì vậy phần bên phải ( s.length() > 0
) không được đánh giá.
Nếu bạn sử dụng |
toán tử hoặc &
toán tử, thì sẽ không có đánh giá lười biếng : mỗi biểu thức con sẽ luôn được đánh giá.
2. Thứ tự ưu tiên thao tác trong Java
Như bạn có thể nhớ từ lớp toán ở trường trung học của mình, toán tử nhân có độ ưu tiên cao hơn toán tử cộng. Dấu ngoặc đơn thậm chí còn có mức độ ưu tiên cao hơn: các biểu thức trong ngoặc đơn được đánh giá trước, sau đó là phép nhân và phép chia, sau đó là phép cộng và phép trừ.
Các toán tử trong Java cũng có thứ tự ưu tiên. Sự khác biệt là a) có nhiều toán hạng hơn một chút, b) đối với một số toán tử, toán hạng được đánh giá từ trái sang phải, trong khi đối với những toán hạng khác - từ phải sang trái.
Đây là một bảng với tất cả các toán tử Java:
Loại | Nhà điều hành | liên kết |
---|---|---|
hậu tố | () [] . |
Từ trái sang phải |
một ngôi | ++ -- ! ~ |
Phải sang trái |
phép nhân | * / % |
Từ trái sang phải |
phụ gia | + - |
Từ trái sang phải |
dịch chuyển | >> >>> << |
Từ trái sang phải |
quan hệ | > >= < <= |
Từ trái sang phải |
bình đẳng | == != |
Từ trái sang phải |
BitwiseAND |
& |
Từ trái sang phải |
Exclusive OR (XOR) |
^ |
Từ trái sang phải |
BitwiseOR |
| |
Từ trái sang phải |
Hợp lýAND |
&& |
Từ trái sang phải |
Hợp lýOR |
|| |
Từ trái sang phải |
có điều kiện | ?: |
Phải sang trái |
Phân công | = += -= *= /= %= >>= <<= &= ^= |= |
Phải sang trái |
dấu phẩy | , |
Từ trái sang phải |
Dòng trên cùng chứa các toán tử có độ ưu tiên cao nhất. Dấu ngoặc đơn ()
được sử dụng để đặt mức độ ưu tiên một cách rõ ràng. Dấu ngoặc vuông []
được sử dụng để truy cập một phần tử tại một chỉ mục cụ thể của một biến mảng. Toán tử dấu chấm ( .
) được sử dụng để truy cập các trường và phương thức bằng cách sử dụng tham chiếu đến một đối tượng hoặc lớp.
Các toán tử trong bảng càng thấp thì mức độ ưu tiên của chúng càng thấp.
Nếu bạn sử dụng nhiều toán tử trong một biểu thức, đừng lười biếng: hãy thêm dấu ngoặc đơn.
Trong Java, bạn có thể viết một cái gì đó như if (a & 1<< b > ~c)
, nhưng bạn không nên viết. Bạn đang viết mã không chỉ cho trình biên dịch mà còn cho các lập trình viên khác. Mã càng dễ đọc thì càng tốt.
3. Gia số tiền tố và hậu tố
Như bạn đã biết, Java có toán tử tăng ( ++
) và toán tử giảm ( --
). Tương ứng, chúng tăng và giảm giá trị của một biến theo 1
.
Điều mà bạn có thể không biết là có hai loại toán tử này: tiền tố (toán tử được đặt trước biến) và hậu tố (toán tử được đặt sau biến). Và hai loại toán tử hoạt động hơi khác một chút.
Trong Java, bạn có thể viết một biểu thức như sau:
int a = 5;
int b = a++;
Nếu ++
toán tử xuất hiện sau một biến và biến đó là một phần của biểu thức nào đó (như trong ví dụ trên), thì biểu thức sẽ sử dụng giá trị hiện tại của biến và chỉ sau đó biến mới được tăng thêm 1
.
Nói cách khác, một cái gì đó như thế này sẽ xảy ra:
int a = 5;
int b = a;
a = a + 1;
Đó là, b
sẽ 5
không 6
như bạn có thể nghĩ ngay từ cái nhìn đầu tiên.
Nếu ++
toán tử đứng trước biến và biến là một phần của biểu thức nào đó, thì trước tiên, nó sẽ được tăng thêm 1
và chỉ sau đó giá trị của nó mới được sử dụng trong biểu thức.
int a = 5;
int b = ++a;
Ví dụ trên tương đương với ví dụ sau:
int a = 5;
a = a + 1;
int b = a;
Ở đây, b
sẽ bằng 6
.
Thậm chí còn có một ví dụ được các lập trình viên Java sử dụng để xác định xem người khác cũng là một lập trình viên Java hay không:
int a = 5;
int b = ++a + ++a;
Đúng, bạn cũng có thể viết điều đó.
Ví dụ này sẽ biên dịch tốt và biến thành một cái gì đó như thế này:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
Đối với --
người điều hành, mọi thứ đều giống hệt nhau.
GO TO FULL VERSION