什么是&=和| =

问题描述:

我会通过一些VC++代码,在一个大的代码库和跨越这来了:什么是&=和| =

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

是否有这样的运营商如& =或| =在C++?它是为了什么?
这相当于nState = nState & ~TOOL_TIPS_VISIBLE吗?

+0

答案可能不像这样直截了当(尽管很可能是这样)。我添加了一些您可能会觉得有用的信息。 –

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

+0

不一定正确,请参阅我的答案。 –

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

是的。 &=&什么+=+

及其按位和或

在第一种情况下

的标志(位)被断开

nState &= ~TOOL_TIPS_VISIBLE 

在标记被打开

第二壳体
nState |= TOOL_TIPS_VISIBLE 

x &= y; 

相当于:

x = x & y; 

以同样的方式,

x|= y; 

等同于:

x = x | y; 

&|类似于&&||,只有他们工作在按位时尚。所以现在你可以想象&=|=的作用类似于+=。那是x &= y; ==> x = x & y;

什么没有提到的是&=|=运算符可以被重载。因此,你发布的代码取决于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