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 == d
và e == f
là khô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 là đú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 đó bar
và baz
đượ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 a
là null
, nhưng vì biểu thức ngắn mạch, nếu a != null
là false
, 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 ||
và &&
được đoản mạch, nhưng |
và &
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.
Nguồn
2012-02-18 21:44:27
http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt