2008-11-13 3 views
8

Nếu tôi đánh giá hai biến và không phải là hai lời gọi phương thức thì có vấn đề thời tiết tôi sử dụng "& &" hoặc "&"Có một thời gian khi && (AndAlso) không quan trọng hơn & (Và)

//some logic that sets bool values 

boolean X = true; 
boolean Y = true; 

if (X & Y){ 
    // perform some operation 
} 

if (X && Y){ 
    // perform some operation 
} 

Thêm sách tôi đang sử dụng cho C# 3.0/.NET 3.5 chỉ làm cho tham chiếu đến toán tử & &, là toán tử & biến mất không?

Trả lời

3

Như đã được quan sát, & là toán tử bitwise AND. Toán nhị phân thô dường như ít phổ biến hơn và ít phổ biến hơn theo thời gian, với số lượng nhà phát triển ngày càng tăng không thực sự hiểu số học bitwise. Mà có thể là một nỗi đau ở lần.

Tuy nhiên, có rất nhiều tác vụ được giải quyết tốt nhất với điều này, đặc biệt là bất kỳ nội dung nào nhìn vào dữ liệu dưới dạng cờ. Toán tử & là cần thiết 100% và không đi đâu cả - nó đơn giản không được sử dụng thường xuyên như toán tử ngắn mạch boolean &&.

Ví dụ:

[Flags] 
enum SomeEnum { // formatted for space... 
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ... 
} 
static void Main() { 
    SomeEnum value = GetFlags(); 
    bool hasFoo = (value & SomeEnum.Foo) != 0; 
} 
static SomeEnum GetFlags() { ... } 
9

Luôn sử dụng & & nếu bạn đang thực hiện kiểm tra logic đúng/sai. Một đơn & thực hiện một chút 'khôn ngoan' và '. Nó làm cho công việc như một thử nghiệm logic trong một số trường hợp nhưng nó không được đảm bảo để làm việc cho tất cả các trường hợp logic. Việc sử dụng phổ biến nhất của một đơn & là khi áp dụng một mặt nạ bit.

Ví dụ (& &):

true && true == true 

Ví dụ (&):

00101001 & 00100001 = 00100001 
1

& là một nhà điều hành Bitwise khi & & là AND điều hành. Hai hoạt động hoàn toàn khác nhau.

int a = 1; 
int b = 2; 
assert (a & b == 0) 
assert (a && b == true) 

EDIT: Rất tiếc ... ví dụ này không hoạt động trong C#. Nó nên trong C++. Hy vọng nó minh họa ý định và sự khác biệt giữa hai nhà khai thác.

+0

Trong C# một đơn & làm việc như dự định. –

+0

Tôi đã thử nó và trình biên dịch bị phàn nàn: Toán tử '&' không thể áp dụng cho các toán hạng kiểu 'int' và 'bool' – jpoh

+0

Thats vì int không phải là giá trị 8 bit. Bạn cần phải đưa byte vào một int để làm cho nó hoạt động. – FlySwat

7

Nếu bạn sử dụng một đơn & (Và) phần thứ hai của biểu thức được đánh giá. Điều này có thể là xấu nếu phần thứ hai dựa vào phần đầu tiên là đúng sự thật. Thông thường, luôn sử dụng & & vì phần thứ hai không được đánh giá nếu phần đầu tiên là sai.

Về mặt logic, đơn & thực hiện thao tác bitwise như những người khác đã nói, vẫn còn hợp lệ để so sánh/đánh giá boolean. Thực sự chỉ có một thời gian duy nhất & (hoặc |) nên được sử dụng (hoặc boolean đánh giá) là nếu đánh giá thứ hai nên luôn luôn chạy (nếu nó là một cuộc gọi chức năng/sửa đổi). Đây là thực hành xấu thông qua và có lẽ lý do tại sao cuốn sách không đề cập đến nó.

Độc thân & hữu ích với cờ enums và mặt nạ bit.

Sau đây sẽ ném một ngoại lệ của obj là null:

bool b = obj != null & obj.IsActive 

Nhưng điều này sẽ làm việc:

bool b = obj != null && obj.IsActive 

này là xấu:

bool b = obj.IsActive && obj.SetActive(false); 
bool b = obj.IsActive & obj.SetActive(false); 

Nhà điều hành & là đây ở lại.