Toán tử logic - 1

"Chào, Amigo!"

"Bây giờ chúng ta sẽ có một bài học nhỏ về toán tử logic."

"Những toán tử logic nào bạn biết?"

— HOẶC (||), VÀ (&&), KHÔNG (!)

"Yep. Làm tốt lắm. Và bạn có nhớ chúng hoạt động như thế nào không?"

"Đúng."

"OR cho kết quả đúng khi có ít nhất một toán hạng là đúng."

"VÀ cho kết quả đúng khi cả hai toán hạng đều đúng."

"KHÔNG thay đổi true thành false và false thành true."

"Đúng vậy. Và các toán tử được đánh giá theo thứ tự nào trong biểu thức này?"

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b || !c && b || !a;

"Đây hết thảy đều rất đơn giản."

"Đầu tiên, KHÔNG (!), sau đó là VÀ (&&), và sau đó là HOẶC (||) ở cuối."

Nếu chúng tôi thêm dấu ngoặc đơn, thì chúng tôi sẽ nhận được:

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a && b) || ((!c) && b) || (!a);

"Tất cả đều đúng, làm tốt lắm. Và kết quả là gì?"

— 1) (a && b) == (đúng && sai) == sai

2) ((!c) && b) == (sai && sai) == sai

3) (!a) == sai

4) sai || sai || sai == sai

"Kết quả là sai."

"Có vẻ như bạn biết rất rõ chủ đề này. Vậy thì tôi sẽ kể cho bạn nghe một vài bí mật nho nhỏ."

"Đầu tiên, các biểu thức logic được đánh giá từ trái sang phải."

"Thứ hai, đánh giá ngắn mạch được sử dụng ở đây (các tính toán chỉ được thực hiện nếu cần thiết). Nếu kết quả cuối cùng đã được biết từ việc đánh giá một phần của biểu thức, thì phần còn lại của biểu thức sẽ không được đánh giá."

Ví dụ
boolean result = (true && false) || (true && true) || (true && false);

"Biểu thức này được chia thành ba phần được phân tách bằng toán tử OR (||)."

"Nếu ít nhất một phần là đúng, thì câu trả lời là đúng và không có gì khác cần được xem xét. Theo đó, biểu thức được đánh giá như sau:"

1)  Đánh giá phần đầu tiên:  (true && false) == false

2)  Đánh giá phần thứ hai:  (true && true) == true

3) Chúng tôi không đánh giá phần thứ ba, vì rõ ràng câu trả lời sẽ đúng .

"Cách tiếp cận này còn được gọi là đánh giá lười biếng."

"OK. Và nó có gì đặc biệt?"

"Không có gì—cho đến khi bạn bắt đầu gọi các phương thức bên trong biểu thức. Nếu một phần của biểu thức bị bỏ qua, thì các phương thức trong phần bị bỏ qua sẽ không được gọi."

"Nhưng cách tiếp cận này đã trở nên rất phổ biến. Đây là lý do:"

Ví dụ:
Job job = null;

if (job != null && job.isDone())
{
…
}

"Nếu công việc là null khi biểu thức được đánh giá, thì lệnh gọi job.isDone() sẽ không xảy ra!"

"Thật vậy, phần đầu tiên của biểu thức là sai, theo sau là AND (&&). Vì vậy, toàn bộ biểu thức sẽ được biết là sai và phần thứ hai sẽ không cần thiết."

"Chính xác. Đó là một kỹ thuật tốt, phải không?"

"Chuẩn rồi."