1. Phép toán Boolean

Các toán tử |&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ó &&||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 ||&&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ẽ truebấ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à expression3bao 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 expression1bằng false, thì không có điểm nào để đánh giá expression2expression3: kết quả sẽ falsebấ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! = nulltrue.

Nếu sbằ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á.

Tất cả những gì để nói:

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à, bsẽ 5không 6như 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 1và 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, bsẽ 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.