2012-06-22 22 views
13

Nội dung của cả hai điều sau đây nếu khối nên được thực thi:Có sự khác biệt nào giữa việc sử dụng toán tử logic hoặc toán tử bitwise trong một khối if trong Java không?

if(booleanFunction() || otherBooleanFunction()) {...} 
if(booleanFunction() | otherBooleanFunction()) {...} 

Vì vậy, sự khác biệt giữa việc sử dụng hoặc sử dụng ||| là gì?

Lưu ý: Tôi đã xem xét điều này và tìm thấy câu trả lời của riêng tôi, mà tôi đã đưa vào bên dưới. Xin vui lòng sửa tôi hoặc đưa ra quan điểm của riêng bạn. Có chắc chắn là chỗ để cải thiện!

+1

Tôi không hiểu điểm của câu hỏi này, bạn đặt một câu hỏi mà bạn tự trả lời - trước khi bất kỳ ai khác có thể trả lời? – Nim

+1

có lẽ là huy hiệu không? – Durandal

+9

@Nim và Durandal: Hmm .. Tôi có thể đã bỏ lỡ điểm, nhưng theo [this] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your của mình -own-questions /) nó thực sự là tốt để trả lời câu hỏi của riêng bạn nếu bạn nghĩ rằng nó có thể có liên quan đến những người khác. Tôi giải quyết câu hỏi của riêng mình và nghĩ rằng tôi muốn chia sẻ, vì vậy tôi đã đi đến những rắc rối của tài liệu nó ở đây. Không có nghĩa là xúc phạm bất cứ ai – Miquel

Trả lời

11

Toán tử logic hoạt động trên các phép toán logic và toán tử bitwise hoạt động trên các bit. Trong trường hợp này, hiệu ứng sẽ là như nhau, nhưng có hai sự khác biệt:

  1. Nhà điều hành Bitwise không có nghĩa là cho rằng, mà làm cho nó khó khăn hơn để đọc nhưng quan trọng nhất là
  2. Các toán tử logic OR sẽ đánh giá điều kiện đầu tiên. Nếu đó là sự thật, nó không có vấn đề gì các kết quả điều kiện tiếp theo trong, kết quả sẽ là sự thật, vì vậy mệnh đề thứ hai là không thực hiện

Dưới đây là một số mã tiện dụng để chứng minh điều này:

public class OperatorTest { 

    public static void main(String[] args){ 
     System.out.println("Logical Operator:"); 
     if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){ 
      //doNothing 
     } 

     System.out.println("Bitwise Operator:"); 
     if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){ 
      //doNothing 
     } 
    } 

    public static boolean sayAndReturn(boolean ret, String msg){ 
     System.out.println(msg); 
     return ret; 
    } 
} 
34

Cả hai có cách sử dụng khác nhau. Mặc dù trong nhiều trường hợp (khi giao dịch với boolean) có thể xuất hiện rằng chúng có cùng tác dụng, điều quan trọng cần lưu ý là logic-OR là ngắn mạch, có nghĩa là nếu đối số đầu tiên của nó được đánh giá là true, thì đối số thứ hai còn lại chưa được đánh giá. Toán tử bitwise đánh giá cả hai đối số của nó bất kể.

Tương tự, lô-gic AND là ngắn mạch, có nghĩa là nếu đối số đầu tiên của nó được đánh giá là false thì giá trị thứ hai sẽ không được đánh giá. Một lần nữa, bitwise-AND thì không.

Bạn có thể thấy điều này trong hành động ở đây:

int x = 0; 
int y = 1; 
System.out.println(x+y == 1 || y/x == 1); 
System.out.println(x+y == 1 | y/x == 1); 

Tuyên bố in đầu tiên chỉ hoạt động tốt và trả về true kể từ khi số đầu tiên để đánh giá đúng, và do đó đánh giá dừng. Lỗi báo cáo in thứ hai vì nó không phải là ngắn mạch, và một bộ phận bằng không được gặp phải.

4
if(booleanFunction() || otherBooleanFunction()) {...} 

Trong điều kiện này nếu booleanFunction() lợi nhuận true sau đó otherBooleanFunction() sẽ không được thực thi.

if(booleanFunction() | otherBooleanFunction()) {...} 

Nhưng trong điều hành Bitwise cả hai chức năng - booleanFunction()otherBooleanFunction() sẽ được thực thi cho dù booleanFunction() lợi nhuận true hoặc false

6

cho các lập trình viên, chỉ có một sự khác biệt.

  1. các toán tử logic của bạn là các toán tử lôgíc, tức là. họ chỉ kiểm tra một điều kiện và nhận kết quả dựa trên điều kiện đó.

booleanFunction() || otherBooleanFunction() sẽ là true nếu đúng. tương tự, booleanFunction() & & otherBooleanFunction() sẽ là false nếu giá trị sai. Vì vậy, tại sao thử nghiệm một trong những khác. đó là những gì các nhà khai thác hợp lý làm.

Nhưng những thứ bitwise kiểm tra cả hai. Một ứng dụng thường xuyên của khái niệm này là như sau.

if(someObject != null && someObject.somemethod()) 

Vì vậy, trong trường hợp này nếu bạn thay thế && bởi & sau đó chờ cho một thảm họa. Bạn sẽ sớm nhận được NullPointerException khó chịu ...

0

Sự khác biệt giữa bitwise một toán tử logic - 1. Toán tử bitwise hoạt động trên bit trong khi toán tử logic hoạt động trên câu lệnh. 2. Bitwise và được đại diện bởi & trong khi hợp lý và được đại diện bởi & &. 3. Bitwise hoặc được đại diện bởi | trong khi logic hoặc được đại diện bởi ||.

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