2014-09-26 13 views
7

Khi nào bạn cần sử dụng toán tử logic ngắn mạch không? Nói cách khác ...Toán tử logic HOẶC không có đoản mạch

Khi bạn sẽ sử dụng

if(x == 1 | x==2) 

Thay vì

if(x == 1 || x==2) 

Nếu có điều kiện đầu tiên là đúng ... Sau đó, toàn bộ tuyên bố là đã thành sự thật.

Cập nhật: và cùng một câu hỏi cho & và & &

+0

Bạn có muốn biết điều này "đối với các loại boolean" không? Đối với các loại tích phân, logic hoặc toán tử rất hữu ích trong chính nó, nhưng sau đó hoạt động shortcircuit không phải là một thay thế vì nó không hoạt động trên các kiểu tích phân. –

+0

Xem câu trả lời tại đây: http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators – Halogen

Trả lời

8

Một ví dụ phát sinh nếu chúng ta có hai chức năng và chúng tôi muốn cả hai được thực hiện:

if (foo() | bar()) 

Nếu chúng ta đã sử dụng ||, sau đó bar() sẽ không được thực hiện nếu foo() trả về true, có thể không phải là những gì chúng tôi muốn. (. Mặc dù đây là một chút của một trường hợp khó hiểu, và thường xuyên hơn không || lựa chọn thích hợp hơn)

Một tình huống tương tự có thể đưa ra &/&&:

if (foo() & bar()) 

Nếu chúng tôi đã sử dụng &&, thì bar() sẽ không được thực thi nếu foo() trả về false, một lần nữa có thể không phải là những gì chúng tôi muốn.

+0

và cũng có thể khi bạn có nếu (x == 1 | x ++ > 2) ... –

+0

@shinjw Đã cập nhật câu trả lời. – arshajii

4

Vâng, có một vài lý do. Lấy ví dụ sau đây:

if(someImportantMethod() | otherImportantMethod()) 
{ 
    doSomething(); 
} 

Nếu bạn cần cả hai phương pháp để được chạy, không phụ thuộc vào kết quả của các phương pháp khác, sau đó bạn sẽ phải sử dụng | thay vì ||.

Điều cần lưu ý là các toán hạng ngắn mạch hơi chậm hơn (mặc dù tác động hiệu suất thường không đáng kể).

2

Theo câu hỏi của bạn,

nếu bạn sử dụng "|" toán tử như "if (x == 1 | x == 2)", cả hai biểu thức được đánh giá và nếu có ít nhất một giá trị TRUE thì hãy chạy phần thân của khối

nếu bạn sử dụng "||" toán tử như "if (x == 1 || x == 2)", biểu thức đầu tiên được đánh giá và nếu nó trả về TRUE thì sẽ không đánh giá biểu thức thứ hai và chạy phần thân của khối

nếu bạn sử dụng "&" nhà điều hành như "if (x == 1 & x == 2)", cả hai biểu thức được đánh giá và nếu cả hai biểu thức là trả lại giá trị TRUE sau đó chạy phần thân của nếu khối

nếu bạn sử dụng "& & "toán tử như" nếu (x == 1 & & x == 2) ", biểu thức đầu tiên được đánh giá và nếu nó trả về FALSE thì sẽ không đánh giá biểu thức thứ hai và KHÔNG chạy phần thân nếu khối

Ngoài ra, "||" và "& &" có thể được sử dụng để tiết kiệm thời gian hoạt động của ứng dụng của bạn

1

Tôi đã hỏi chính câu hỏi này của Josh Bloch một lần và ông đưa ra một lý do khác có thể, IIRC: hiệu suất. Phiên bản ngắn mạch không có nhánh. Nếu toán hạng thứ hai rất rẻ và đầu tiên hầu như luôn đúng, có thể nhanh hơn để tránh việc đánh giá có điều kiện thứ hai và chỉ để cho bộ vi xử lý thực thi nó mà không cần chờ đợi.

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