2011-11-04 82 views
7

我會通過一些VC++代碼,在一個大的代碼庫和跨越這來了:什麼是&=和| =

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

是否有這樣的運營商如& =或| =在C++?它是爲了什麼?
這相當於nState = nState & ~TOOL_TIPS_VISIBLE嗎?

+0

答案可能不像這樣直截了當(儘管很可能是這樣)。我添加了一些您可能會覺得有用的信息。 –

回答

9

x &= y相同x = x & y
x |= y相同x = x | y

+0

不一定正確,請參閱我的答案。 –

2

x &= y意味着x = x & y。所以是的,你是對的。

2

是的。 &=&什麼+=+

3

及其按位和或

在第一種情況下

的標誌(位)被斷開

nState &= ~TOOL_TIPS_VISIBLE 

在標記被打開

第二殼體
nState |= TOOL_TIPS_VISIBLE 
1
x &= y; 

相當於:

x = x & y; 

以同樣的方式,

x|= y; 

等同於:

x = x | y; 
1

&|類似於&&||,只有他們工作在按位時尚。所以現在你可以想象&=|=的作用類似於+=。那是x &= y; ==> x = x & y;

7

什麼沒有提到的是&=|=運算符可以被重載。因此,你發佈的代碼取決於nState的類型(儘管它很明顯是一個int,所以很可能這裏不適用)。重載&=不會隱超載&,所以在這種情況下

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

它可能還取決於什麼TOOL_TIPS_VISIBLE是。

struct s{ 
    int x; 
}; 

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

現在,只要你做的事:

s TOOL_TIPS_VISIBLE; 
x &= TOOL_TIPS_VISIBLE; 

x將成爲0。再一次,極不可能,但很好知道盡管如此。

所有其他答案可能適用於此,但這是值得考慮的。

+0

您提出了一個值得關注的問題,但是如果我找到了一個代碼庫,它用一個含義和'&=與另一個含義'相重疊,我會立即修復這種明顯的非正交性,也許會尋找某人來懲罰他們很可能會因爲這種可怕而遺留下來。過載應該是直觀的,增強了代碼的可讀性,而不是將地雷放在一邊。 – wallyk

+0

另一種情況是,如果'x'是一個帶有副作用的表達式,'x | = y'會調用一次副作用,而'x = x | y'會應用它兩次(或者甚至調用未定義的行爲,如果副作用沒有被序列點正確保護)。這與宏特別相關(儘管在C++中你通常應該避免這些)。 – celtschk