a

Câu hỏi Sự khác biệt giữa | và || hoặc nhà khai thác?


Tôi đã luôn sử dụng || (hai ống) trong các biểu thức OR, cả trong C # và PHP. Thỉnh thoảng tôi thấy một ống đơn được sử dụng: |. Sự khác biệt giữa hai tập quán đó là gì? Có bất kỳ cảnh báo nào khi sử dụng cái kia hay chúng có thể hoán đổi cho nhau?


241
2017-08-29 21:11


gốc




Các câu trả lời:


Cũng giống như & và && nhà điều hành, toán tử đôi là toán tử "ngắn mạch".

Ví dụ:

if(condition1 || condition2 || condition3)

Nếu điều kiện 1 là đúng, điều kiện 2 và 3 sẽ KHÔNG được kiểm tra.

if(condition1 | condition2 | condition3)

Điều này sẽ kiểm tra các điều kiện 2 và 3, ngay cả khi 1 đã đúng. Vì điều kiện của bạn có thể là các chức năng khá tốn kém, bạn có thể tăng hiệu suất tốt bằng cách sử dụng chúng.

Có một báo trước lớn, NullReferences hoặc các vấn đề tương tự. Ví dụ:

if(class != null && class.someVar < 20)

Nếu lớp là null, câu lệnh if sẽ dừng sau class != null là sai. Nếu bạn chỉ sử dụng &, nó sẽ cố gắng kiểm tra class.someVar và bạn nhận được một tốt đẹp NullReferenceException. Với Or-Operator mà có thể không phải là một cái bẫy nhiều vì nó không chắc rằng bạn kích hoạt một cái gì đó xấu, nhưng đó là một cái gì đó để ghi nhớ.

Không ai từng sử dụng đĩa đơn & hoặc là | các toán tử mặc dù, trừ khi bạn có một thiết kế trong đó mỗi điều kiện là một hàm mà HAS sẽ được thực hiện. Âm thanh giống như một mùi thiết kế, nhưng đôi khi (hiếm khi) đó là một cách sạch sẽ để làm công cụ. Các & nhà điều hành không "chạy các chức năng 3, và nếu một trong số họ trả về false, thực thi khối khác", trong khi | "chỉ chạy khối khác nếu không trả về false" - có thể hữu ích, nhưng như đã nói, thường thì đó là một mùi thiết kế.

Có một lần sử dụng thứ hai của | và & nhà điều hành mặc dù: Hoạt động bitwise.


401
2017-08-29 21:17



Vâng, tôi không tin nó cho đến khi tôi tạo ra một ứng dụng giao diện điều khiển - nhưng chúa tốt! Tại sao họ lại cho bạn dây thừng để treo mình! Tôi ghét điều đó về VB.NET - từ khóa OrElse và AndAlso! - Jarrod Dixon♦
Dạy mọi người sử dụng & và | như các nhà khai thác có điều kiện là một hack, và sẽ khiến họ gặp rắc rối nếu họ cần sử dụng C / C ++: 1 && 2 là đúng trong khi 1 & 2 là sai. - BlueRaja - Danny Pflughoeft
Nó không phải là một hack, nó được chính thức chỉ định cho C # trong phần 7.10.3 Các toán tử logic logic Boolean: "Kết quả của x | y là true nếu x hoặc y là true. Nếu không, kết quả là false". Xem thêm Phần 7.11 Các toán tử logic có điều kiện: "Phép toán x || y tương ứng với phép toán x | y, ngoại trừ rằng y chỉ được đánh giá nếu x là sai." tiếp tục "hợp pháp hoá" | như một toán tử có điều kiện. Và mọi người sẽ sử dụng C / C ++ sẽ gặp rắc rối dù sao nếu họ chỉ mù quáng giả định rằng công cụ hoạt động bình đẳng. Như đã nói: Sử dụng | trong một tuyên bố nếu là một mùi thiết kế, nhưng một hoạt động hoàn toàn hợp pháp. - Michael Stum♦
Tôi chưa bao giờ nói nó không hợp pháp, chỉ là hack, mà nó là (bạn đang sử dụng & để truyền tải một ý nghĩa khác với ý nghĩa của nó hầu như luôn luôn có nghĩa là: bitwise-và). - BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Gọi một tính năng được ghi lại là một tài liệu khi tài liệu nói rằng nó được dự định sẽ được sử dụng, giống như việc sử dụng câu lệnh chuyển đổi "một lỗi khác". Một công cụ của nó trong hộp công cụ, một công cụ đặc biệt hiếm khi được sử dụng có thể, nhưng một công cụ không kém. - Gent


|| là toán tử OR logic. Nghe có vẻ như về cơ bản bạn biết đó là gì. Nó được sử dụng trong các câu lệnh có điều kiện như, trong khi, v.v.

condition1 || condition2

Đánh giá là đúng nếu một trong hai điều kiện1 HOẶC điều kiện 2 là đúng.

| là toán tử OR bitwise. Nó được sử dụng để hoạt động trên hai con số. Bạn nhìn vào từng bit của từng số riêng lẻ và, nếu một trong các bit là 1 trong ít nhất một trong các số, thì bit kết quả cũng sẽ là 1. Đây là vài ví dụ:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

Hy vọng rằng có ý nghĩa.

Vì vậy, để trả lời hai câu hỏi cuối cùng, tôi sẽ không nói có bất kỳ cảnh báo nào ngoài việc "biết sự khác biệt giữa hai toán tử". Họ không thể hoán đổi cho nhau bởi vì họ làm hai việc hoàn toàn khác nhau.


67
2017-08-29 21:17





Một là một "bitwise hoặc".

10011b | 01000b => 11011b

Khác là một logic hoặc.

true hoặc false => true


27
2017-08-29 21:13





Câu hỏi hay. Hai toán tử này làm việc giống nhau trong PHP và C #.

| là OR một chút. Nó sẽ so sánh hai giá trị bằng bit của chúng. Ví dụ. 1101 | 0010 = 1111. Điều này cực kỳ hữu ích khi sử dụng các tùy chọn bit. Ví dụ. Đọc = 01 (0X01) Viết = 10 (0X02) Đọc-Ghi = 11 (0X03). Một ví dụ hữu ích sẽ là mở tệp. Một ví dụ đơn giản sẽ là:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

|| là một OR hợp lý. Đây là cách hầu hết mọi người nghĩ về OR và so sánh hai giá trị dựa trên sự thật của họ. Ví dụ. Tôi sẽ đến cửa hàng hoặc tôi sẽ đi đến trung tâm mua sắm. Đây là mã được sử dụng thường xuyên nhất trong mã. Ví dụ.

if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer

Tài nguyên PHP: http://us3.php.net/language.operators.bitwise

Tài nguyên C #: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


10
2017-08-29 21:23



FWIW, về mặt kỹ thuật, trong C # | là một hợp lý hoặc khi áp dụng cho booleans. Là trạng thái tham chiếu được liên kết của bạn. Trong thực tế, kết quả cuối cùng cũng giống như nếu nó là một toán tử bitwise, bởi vì các giá trị bitwise của true và false là như vậy mà một bitwise hoặc giá trị của họ tạo ra kết quả chính xác giống như một logic hay không. Đó là (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2). - ToolmakerSteve


Ví dụ đơn giản trong java

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

đầu ra:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

4
2018-03-23 08:02





Các đường ống duy nhất, |, là một trong những bitwise toán tử.

Từ Wikipedia:

Trong họ ngôn ngữ lập trình C, toán tử OR bitwise là "|" (ống). Một lần nữa, toán tử này không được nhầm với Boolean "logic hoặc" đối tác của nó, xử lý các toán hạng của nó như các giá trị Boolean, và được viết "||" (hai ống).


1
2017-08-29 21:26





& - (Điều kiện 1 & Điều kiện 2): kiểm tra cả hai trường hợp ngay cả khi trường hợp đầu tiên là sai

&& - (Điều kiện 1 && Điều kiện 2): không bận tâm kiểm tra trường hợp thứ hai nếu trường hợp một                                    là sai

&& - toán tử sẽ làm cho mã của bạn chạy nhanh hơn, chuyên nghiệp và hiếm khi được sử dụng

| - (Điều kiện 1 | Điều kiện 2): kiểm tra cả hai trường hợp ngay cả khi trường hợp 1 là đúng

|| - (Điều kiện 1 || Điều kiện 2): không bận tâm kiểm tra trường hợp thứ hai nếu trước                                    một là đúng

|| - nhà điều hành sẽ làm cho mã của bạn chạy nhanh hơn, chuyên nghiệp | hiếm khi được sử dụng


1
2017-11-14 03:58



rarely used? Tất cả phụ thuộc vào những gì bạn muốn hoặc cần phải làm. - Emaborsa


Các | toán tử thực hiện một OR bitwise của hai toán hạng của nó (có nghĩa là cả hai bên phải đánh giá sai để nó trả về false) trong khi || toán tử sẽ chỉ đánh giá toán tử thứ hai nếu nó cần.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


0
2017-08-29 21:15



Nếu bạn thực sự đọc những bài báo đó, bạn sẽ thấy rằng chúng đang đề cập đến các toán tử bitwise - johnc


Ống đơn "|" là "bitwise" hoặc chỉ nên được sử dụng khi bạn biết mình đang làm gì. Ống đôi "||" là một logic hoặc, và có thể được sử dụng trong các câu lệnh logic, như "x == 0 || x == 1".

Dưới đây là ví dụ về bitwise hoặc là: nếu a = 0101 và b = 0011, thì a | b = 0111. Nếu bạn đang đối phó với một hệ thống logic xử lý bất kỳ số không khác là true, thì bitwise hoặc sẽ hành động theo cách giống như logic hoặc, nhưng đối số (bitwise và "&") sẽ KHÔNG. Ngoài ra bitwise hoặc không thực hiện đánh giá ngắn mạch.


0
2017-08-29 21:15





Theo định nghĩa toán học của chúng, OR và AND là toán tử nhị phân; họ xác minh các điều kiện LHS và RHS bất kể, tương tự như | và &.

|| và && thay đổi các thuộc tính của toán tử OR và AND bằng cách dừng chúng khi điều kiện LHS không được đáp ứng.


0
2017-09-24 14:44