2010-11-18 189 views

回答

23

假设你使用内置运营商的整数或用户定义的类三立重载运营商,这些是相同的:

a = a | b; 
a |= b; 

的“|=”符号是按位OR赋值运算符。它计算OR与RHS('b')与LHS('a')的价值,并将结果赋予'a',但它只会在评估'a'时这样做。

中的一大好处 '| =' 运算符时 '一个' 本身就是一个复杂的表达式:

something[i].array[j]->bitfield |= 23; 

VS:

something[i].array[i]->bitfield = something[i].array[j]->bitfield | 23; 

是差有意或无意?

...

答:故意 - 显示速记表达的优势......第一个复杂的表达式实际上等同于:

something[i].array[j]->bitfield = something[i].array[j]->bitfield | 23; 

类似的说明适用到所有复合赋值运算符:

+= -= *= /= %= 
&= |= ^= 
<<= >>= 

任何复合运算符exp ression:

a XX= b 

等同于:

a = (a) XX (b); 

除了a被评估一次。请注意这里的括号 - 它显示了分组是如何工作的。

+3

除非操作员重载... – zzzzBov 2010-11-18 17:34:29

+2

虽然一个特别邪恶的类可以实现'| ='来做任何想要的事情。通常,它会以您在此显示的直观方式实现'|'和'| ='。 – 2010-11-18 17:35:42

+1

@zzzzBov:是的 - 在C++中总是有这样的警告;但如果'a'和'b'是整数,那么我认为你是安全的。如果您使用的类重载不可预测,并且不能按预期工作,那么现在是纠正错误或使用不同类的时候了。 – 2010-11-18 17:36:22

8
x |= y 

一样

x = x | y 

一样

x = x [BITWISE OR] y 
+1

你可以说C++中的任何运算符。即使它不总是按位进行操作,或者无论如何都要调用操作符。 – ronag 2010-11-18 17:38:29

+1

@Steve - 并不总是添加。 – 2010-11-18 17:39:13

3

这是按位或compound assignment

在,你可以写x += y以同样的方式来表示x = x + y

你可以写x |= y意味着x = x | y,其中OR放在一起的xy,然后所有的位,结果放入x

要注意的是它可以overloaded,但对于基本类型,你应该确定:-)