2012-02-18 25 views
11

thể trùng lặp:
Does java evaluate remaining conditions after boolean result is known
Why do we usually use || not |, what is the difference?Mạch ngắn là gì và nó được sử dụng như thế nào khi lập trình bằng Java?

tôi đã bỏ lỡ bài giảng lớp học của tôi ngày khác và tôi đã tự hỏi nếu có ai có thể đưa ra một lời giải thích những gì ngắn mạch là gì và có lẽ một ví dụ về nó được sử dụng trong một chương trình Java đơn giản. Cảm ơn bạn đã giúp đỡ!

+3

http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt

Trả lời

26

Ngắn mạch là nơi biểu thức dừng lại được đánh giá ngay khi kết quả của nó được xác định. Vì vậy, ví dụ:

if (a == b || c == d || e == f) { 
    // Do something 
} 

Nếu a == b là đúng, sau đó c == de == fkhông bao giờ được đánh giá ở tất cả, bởi vì kết quả của biểu đã được xác định. nếu a == b là sai, thì c == d được đánh giá; nếu đúng, thì e == f sẽ không bao giờ được đánh giá. Điều này có vẻ không thực hiện bất kỳ sự khác biệt, nhưng cần cân nhắc:

if (foo() || bar() || baz()) { 
    // Do something 
} 

Nếu foo() trả về true, sau đó barbaz được không bao giờ gọi, bởi vì kết quả của biểu đã được xác định. Vì vậy, nếu bar hoặc baz có một số hiệu ứng khác hơn là chỉ trả về một cái gì đó (một hiệu ứng phụ ), những hiệu ứng đó không bao giờ xảy ra.

Một ví dụ tuyệt vời của đoản mạch liên quan đến đối tượng tham khảo:

if (a != null && a.getFoo() != 42) { 
    // Do something 
} 

a.getFoo() thường sẽ ném một NullPointerException nếu anull, nhưng vì biểu thức ngắn mạch, nếu a != nullfalse, phần a.getFoo() không bao giờ xảy ra, vì vậy chúng tôi không có ngoại lệ.

Lưu ý rằng không phải tất cả các biểu thức đều được đoản mạch. Các nhà điều hành ||&& được đoản mạch, nhưng |& không, cũng không phải là * hoặc /; trong thực tế, hầu hết các nhà khai thác là không.

2

Short Circuit: Nếu phần đầu tiên là true đừng bận tâm đến việc đánh giá phần còn lại của biểu thức. Cùng một logic áp dụng cho false trong trường hợp của && cũng ngắn mạch

+0

Chính xác hơn: dừng đánh giá biểu thức logic ngay sau khi kết quả là chắc chắn. – biziclop

+1

Bạn chỉ cần nói rằng Java chỉ đánh giá phần đầu tiên của một biểu thức. – Jeffrey

+0

Tại sao lại là downvote? – Cratylus

0

Ngắn mạch đánh giá biểu thức có nghĩa là chỉ cần đánh giá một phần của biểu thức trước khi tìm giá trị của biểu thức. Ví dụ:

a == null || a.size() == 0 

Nếu anull, các a.size() == 0 subexpression sẽ không được đánh giá, bởi vì các nhà điều hành boolean || đánh giá để true nếu một trong các toán hạng của nó là true.

Tương tự như vậy, đối với biểu thức này:

a != null && a.size() > 0 

Nếu anull thì a.size() > 0 sẽ không được đánh giá, bởi vì các nhà điều hành boolean && đánh giá để false nếu một trong các toán hạng của nó là false.

Trong các ví dụ trên, toán tử boolean &&|| được gọi là đoản mạch, với thực tế là toán hạng thứ hai có thể không được đánh giá nếu giá trị của toán hạng đầu tiên đủ để xác định giá trị của toàn bộ biểu thức . Để so sánh, các toán hạng &| là các toán tử boolean không mạch ngắn tương đương.

3

Short-circuit evaluation có nghĩa là khi đánh giá biểu thức boolean (hợp lý ANDOR), bạn có thể dừng ngay khi bạn tìm thấy điều kiện đầu tiên thỏa mãn hoặc phủ nhận biểu thức.

Ví dụ, giả sử bạn đã đánh giá một logic OR với một số tiểu biểu, mỗi trong số đó là rất tốn kém để đánh giá:

if (costlyTest1() || costlyTest2() || costlyTest3()) { // ... 

Các JVM có thể ngăn chặn việc đánh giá "costlyTest" chức năng càng sớm càng nó tìm thấy một trả về true, vì điều đó sẽ thỏa mãn biểu thức boolean. Vì vậy, nếu costlyTest1() trả về true thì các thử nghiệm khác sẽ bị bỏ qua. Tương tự như vậy:

if (costlyTest1() && costlyTest2() && costlyTest3()) { // ... 

Các JVM có thể ngăn chặn việc đánh giá các chức năng càng sớm càng nó tìm thấy một mà trả false, vì đó cũng đáp ứng các biểu quan điểm; vì vậy nếu costlyTest1() trả về false thì các hàm khác sẽ không được gọi.

Các quy tắc này liên quan đến bất kỳ mức độ lồng nào của các biểu thức logic và có thể được tận dụng để tránh việc không cần thiết, như được minh họa trong các ví dụ trên.

+0

Ah, tôi hiểu rồi. Đó là đủ đơn giản. Cảm ơn bạn đã giải thích nhanh chóng và rõ ràng! –

0

mạch ngắn là một cách thay thế của việc sử dụng toán tử logic AND hoặc OR nhà khai thác (& hay |)

ví dụ không ngắn mạch HOẶC

if(false | true) { 

} 

Điều kiện đầu tiên và điều kiện thứ hai đều được đánh giá ngay cả khi sai là không đúng (luôn luôn là như vậy).

Tuy nhiên nó được được viết như một ngắn mạch OR:

if(false || true) { 

} 

Điều kiện đầu tiên là chỉ đánh giá vì nó là sai sự thật, đúng là không được đánh giá vì nó không cần thiết.

Các vấn đề liên quan