2011-11-04 44 views
7

Tôi đã đi qua một số VC++ mã trong một mã cơ sở lớn và đi qua này:gì là & = và | =

if (nState & TOOL_TIPS_VISIBLE) 
     nState &= ~TOOL_TIPS_VISIBLE; 
    else 
     nState |= TOOL_TIPS_VISIBLE; 
    break; 

Có bất kỳ nhà điều hành như & = hay | = trong C++? Nó là gì?
Có phải tương đương với nState = nState & ~TOOL_TIPS_VISIBLE không?

+0

Câu trả lời có thể không thẳng thắn như thế này (mặc dù rất có khả năng là nó). Tôi đã thêm một số thông tin khác mà bạn có thể thấy hữu ích. –

Trả lời

9

x &= y cũng giống như x = x & y
x |= y cũng giống như x = x | y

+0

Không nhất thiết phải đúng, xem câu trả lời của tôi. –

2

x &= y nghĩa x = x & y. Vì vậy, có bạn nói đúng.

2

Có. &=&+=+

3

Bitwise của nó và hay

trong trường hợp đầu tiên lá cờ (bit) bị tắt

nState &= ~TOOL_TIPS_VISIBLE 

trong trường hợp thứ hai lá cờ được bật

nState |= TOOL_TIPS_VISIBLE 
1
x &= y; 

tương đương với:

x = x & y; 

Trong cùng một cách,

x|= y; 

tương đương với:

x = x | y; 
1

&| cũng tương tự như &&||, duy nhất họ làm việc trong Bitwise thời trang. Vì vậy, bây giờ bạn có thể tưởng tượng &=|= hoạt động tương tự như +=. Đó là x &= y; ==> x = x & y;

7

Điều không được đề cập là cả hai toán tử &=|= đều có thể bị quá tải. Vì vậy, mã bạn đăng phụ thuộc vào loại nState (mặc dù nó khá rõ ràng là một int, vì vậy hầu hết có lẽ điều này không áp dụng ở đây). Quá tải &= không ngầm quá tải &, vì vậy trong trường hợp này

x &= y might not be the same as x = x & y 

Nó cũng có thể phụ thuộc vào những gì TOOL_TIPS_VISIBLE là.

struct s{ 
    int x; 
}; 

void operator &= (int& x, s y) 
{ 
    x = 0; 
} 

Bây giờ bất cứ khi nào bạn làm:

s TOOL_TIPS_VISIBLE; 
x &= TOOL_TIPS_VISIBLE; 

x sẽ trở thành 0. Một lần nữa, rất khó, nhưng tốt để biết tuy nhiên.

Tất cả các câu trả lời khác có thể áp dụng ở đây, nhưng điều này đáng xem xét.

+0

Bạn đưa ra một mối quan tâm xứng đáng, nhưng nếu tôi tìm thấy một cơ sở mã bị quá tải '& =' với một nghĩa và '&' với một nghĩa khác, tôi sẽ ngay lập tức sửa chữa không thẳng thắn như vậy, và có thể tìm kiếm một người nào đó để chastise, mặc dù họ có lẽ sẽ mất nhiều thời gian cho một di sản khủng khiếp như vậy. Quá tải nên trực quan, tăng cường khả năng đọc mã, không phải đặt tất cả các mìn. – wallyk

+0

Trường hợp khác là nếu 'x' là một biểu thức với các hiệu ứng phụ,' x | = y' sẽ gọi hiệu ứng phụ đó một lần, trong khi 'x = x | y' sẽ áp dụng nó hai lần (hoặc thậm chí gọi hành vi không xác định, nếu các tác dụng phụ không được bảo vệ đúng theo các điểm trình tự). Điều này đặc biệt thích hợp cho các macro (mặc dù trong C++, bạn nên tránh những thứ đó). – celtschk

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