Helpex - Trao đổi & giúp đỡ Đăng nhập
83

Tập hợp nào là ngắn mạch, và chính xác điều gì có nghĩa là biểu thức điều kiện phức tạp là ngắn mạch?

public static void main(String[] args) {
  int x, y, z;

  x = 10;
  y = 20;
  z = 30;

  // T T
  // T F
  // F T
  // F F

  //SET A
  boolean a = (x < z) && (x == x);
  boolean b = (x < z) && (x == z);
  boolean c = (x == z) && (x < z);
  boolean d = (x == z) && (x > z);
  //SET B    
  boolean aa = (x < z) & (x == x);
  boolean bb = (x < z) & (x == z);
  boolean cc = (x == z) & (x < z);
  boolean dd = (x == z) & (x > z);

}
83 hữu ích 1 bình luận 120k xem chia sẻ
214

Các nhà khai thác &&||"ngắn mạch", có nghĩa là họ không đánh giá phía bên tay phải nếu không cần thiết.

Các toán tử &|, khi được sử dụng như các toán tử logic, luôn luôn đánh giá cả hai mặt.

Chỉ có một trường hợp ngắn mạch cho mỗi nhà khai thác, và đó là:

  • false && ... - không cần thiết phải biết phía bên tay phải là gì, kết quả phải là false
  • true || ... - không cần thiết phải biết phía bên tay phải là gì, kết quả phải là true

Hãy so sánh hành vi trong một ví dụ đơn giản:

public boolean longerThan(String input, int length) {
    return input != null && input.length() > length;
}

public boolean longerThan(String input, int length) {
    return input != null & input.length() > length;
}

Phiên bản thứ 2 sử dụng toán tử không ngắn mạch &và sẽ ném NullPointerExceptionnếu inputnull, nhưng phiên bản thứ 1 sẽ trở lại falsemà không có ngoại lệ;

214 hữu ích 2 bình luận chia sẻ
9

SET A sử dụng các toán tử boolean ngắn mạch.

"Đoản mạch" nghĩa là gì trong ngữ cảnh của các toán tử boolean là đối với một tập hợp booleans b1, b2, ..., bn, các phiên bản ngắn mạch sẽ ngừng đánh giá ngay khi lần đầu tiên trong số các booleans này là đúng (|| ) Hay sai (&&).

Ví dụ:

// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)

// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)
9 hữu ích 4 bình luận chia sẻ
4

Đoản mạch có nghĩa là toán tử thứ hai sẽ không được kiểm tra nếu toán tử thứ nhất quyết định kết quả cuối cùng.

Ví dụ: Biểu thức là: Đúng | | Sai

Trong trường hợp | |, tất cả những gì chúng ta cần là một trong những khía cạnh là Đúng. Vì vậy, nếu phía bên trái là đúng, không có điểm nào trong việc kiểm tra phía bên tay phải, và do đó sẽ không được kiểm tra.

Tương tự, Sai && Đúng

Trong trường hợp &&, chúng tôi cần cả hai bên là True. Vì vậy, nếu phía bên tay trái là Sai, không có điểm nào trong việc kiểm tra phía bên tay phải, câu trả lời phải là Sai. Và do đó sẽ không được kiểm tra.

4 hữu ích 0 bình luận chia sẻ
4
boolean a = (x < z) && (x == x);

Loại này sẽ ngắn mạch, có nghĩa là nếu (x < z)đánh giá là sai thì cái sau không được đánh giá, asẽ là sai, nếu không &&cũng sẽ đánh giá (x == x).

& là một toán tử bitwise, nhưng cũng là một toán tử boolean AND không bị đoản mạch.

Bạn có thể kiểm tra chúng bằng cách nào đó như sau (xem số lần phương thức được gọi trong mỗi trường hợp):

public static boolean getFalse() {
    System.out.println("Method");
    return false;
}

public static void main(String[] args) {
    if(getFalse() && getFalse()) { }        
    System.out.println("=============================");        
    if(getFalse() & getFalse()) { }
}
4 hữu ích 3 bình luận chia sẻ
4

Nói một cách dễ hiểu, ngắn mạch có nghĩa là dừng đánh giá một khi bạn biết rằng câu trả lời không còn có thể thay đổi. Ví dụ: nếu bạn đang đánh giá một chuỗi các logic ANDvà bạn phát hiện ra một chuỗi FALSEở giữa chuỗi đó, bạn sẽ biết kết quả sẽ là sai, bất kể giá trị của các biểu thức còn lại trong chuỗi là gì. Điều tương tự cũng xảy ra với một chuỗi ORs: một khi bạn khám phá ra một TRUE, bạn biết câu trả lời ngay lập tức và do đó bạn có thể bỏ qua việc đánh giá phần còn lại của các biểu thức.

Bạn chỉ ra cho Java rằng bạn muốn đoản mạch bằng cách sử dụng &&thay vì &||thay vì |. Bộ đầu tiên trong bài viết của bạn là ngắn mạch.

Lưu ý rằng đây không chỉ là một nỗ lực lưu một vài chu kỳ CPU: trong các biểu thức như thế này

if (mystring != null && mystring.indexOf('+') > 0) {
    ...
}

đoản mạch có nghĩa là sự khác biệt giữa hoạt động chính xác và sự cố (trong trường hợp bí ẩn là null).

4 hữu ích 0 bình luận chia sẻ
2

Java cung cấp hai toán tử Boolean thú vị không tìm thấy trong hầu hết các ngôn ngữ máy tính khác. Các phiên bản thứ cấp của AND và OR được gọi là toán tử logic ngắn mạch . Như bạn có thể thấy từ bảng trước, toán tử OR cho kết quả đúng khi A đúng, bất kể B là gì.

Tương tự, toán tử AND cho kết quả sai khi A sai, bất kể B là gì. Nếu bạn sử dụng ||&&các biểu mẫu, thay vì |&các biểu mẫu của các toán tử này, Java sẽ không bận tâm để đánh giá toán hạng bên phải. Điều này rất hữu ích khi toán hạng bên phải phụ thuộc vào bên trái là đúng hoặc sai để hoạt động đúng.

Ví dụ, đoạn mã sau đây cho thấy cách bạn có thể tận dụng đánh giá logic ngắn mạch để đảm bảo rằng một hoạt động phân chia sẽ hợp lệ trước khi đánh giá nó:

if ( denom != 0 && num / denom >10)

Do dạng AND ( &&) ngắn mạch được sử dụng, không có nguy cơ gây ra ngoại lệ thời gian chạy từ chia cho không. Nếu dòng mã này được viết bằng &phiên bản AND duy nhất , cả hai bên sẽ phải được đánh giá, gây ra ngoại lệ thời gian chạy khi denombằng không.

Đó là thông lệ tiêu chuẩn để sử dụng các dạng AND và OR ngắn mạch trong các trường hợp liên quan đến logic Boolean, để lại các phiên bản ký tự đơn dành riêng cho các hoạt động theo bit. Tuy nhiên, có những trường hợp ngoại lệ cho quy tắc này. Ví dụ, hãy xem xét các tuyên bố sau:

 if ( c==1 & e++ < 100 ) d = 100;

Ở đây, sử dụng một duy nhất &đảm bảo rằng thao tác tăng sẽ được áp dụng cho eccó bằng 1 hay không.

2 hữu ích 0 bình luận chia sẻ
2

Logic OR: - trả về true nếu ít nhất một trong các toán hạng đánh giá là true. Cả hai toán hạng được đánh giá trước khi áp dụng toán tử OR.

Ngắn mạch HOẶC: - nếu toán hạng bên trái trả về true, nó trả về true mà không đánh giá toán hạng bên phải.

2 hữu ích 0 bình luận chia sẻ
2

Có một vài sự khác biệt giữa &&&các nhà khai thác. Sự khác biệt tương tự áp dụng cho |||. Điều quan trọng nhất cần lưu ý là &&là một logic điều hành mà chỉ áp dụng cho toán hạng boolean, trong khi &là một Bitwise điều hành áp dụng cho các loại nguyên cũng như các phép toán luận.

Với một hoạt động hợp lý, bạn có thể làm ngắn mạch bởi vì trong một số trường hợp (như toán hạng đầu tiên của &&false, hoặc toán hạng đầu tiên của ||việc true), bạn không cần phải đánh giá các phần còn lại của biểu thức. Điều này rất hữu ích để thực hiện những việc như kiểm tra nulltrước khi truy cập tệp hoặc phương thức và kiểm tra các số không tiềm năng trước khi chia cho chúng. Đối với một biểu thức phức tạp, mỗi phần của biểu thức được đánh giá đệ quy theo cùng một cách. Ví dụ: trong trường hợp sau:

(7 == 8) || ( (1 == 3) && (4 == 4))

Chỉ các phần nhấn mạnh sẽ được đánh giá. Để tính toán ||, đầu tiên kiểm tra nếu 7 == 8true. Nếu có, phía bên tay phải sẽ bị bỏ qua hoàn toàn. Phía bên tay phải chỉ kiểm tra nếu 1 == 3false. Vì nó là, 4 == 4không cần phải được kiểm tra, và toàn bộ biểu thức ước tính false. Nếu phía bên trái là true, ví dụ 7 == 7thay vì 7 == 8, toàn bộ phía bên phải sẽ bị bỏ qua vì toàn bộ ||biểu thức sẽ là truebất kể.

Với thao tác bitwise, bạn cần đánh giá tất cả các toán hạng vì bạn thực sự chỉ đang kết hợp các bit. Booleans thực sự là một số nguyên một bit trong Java (bất kể các phần bên trong hoạt động như thế nào) và chỉ là trùng hợp ngẫu nhiên mà bạn có thể thực hiện đoản mạch cho các toán tử bitwise trong trường hợp đặc biệt đó. Lý do bạn không thể đoản mạch một số nguyên &hoặc |hoạt động chung là vì một số bit có thể được bật và một số có thể bị tắt trong cả hai toán hạng. Một cái gì đó giống như 1 & 2mang lại số không, nhưng bạn không có cách nào để biết điều đó mà không đánh giá cả hai toán hạng.

2 hữu ích 0 bình luận chia sẻ
1
if(demon!=0&& num/demon>10)

Vì dạng AND (&&) ngắn mạch được sử dụng, không có nguy cơ gây ra ngoại lệ trong thời gian chạy khi quỷ bằng không.

Tham chiếu Phiên bản thứ năm của Java 2 bởi Herbert Schildt

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java logical-operators , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading