【问题标题】:What does the |= operator mean in C++?|= 运算符在 C++ 中是什么意思?
【发布时间】:2011-05-12 04:36:34
【问题描述】:

|= 运算符在 C++ 中的含义是什么?

【问题讨论】:

    标签: c++ operators


    【解决方案1】:

    假设您在整数上使用内置运算符,或者为用户定义的类使用重载的运算符,这些是相同的:

    a = a | b;
    a |= b;
    

    |=”符号是按位或赋值运算符。它计算 RHS ('b') 与 LHS ('a') 的 OR'ing 值并将结果分配给 'a',但这样做时它只计算 'a' 一次。

    '|=' 运算符的一大优势在于,'a' 本身就是一个复杂的表达式:

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

    对比:

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

    这种差异是有意的还是偶然的?

    ...

    答案:故意——为了显示速记表达式的优势……复杂表达式中的第一个实际上相当于:

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

    类似的 cmets 适用于所有复合赋值运算符:

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

    任何复合运算符表达式:

    a XX= b
    

    相当于:

    a = (a) XX (b);
    

    除了a 只被评估一次。请注意此处的括号 - 它显示了分组的工作原理。

    【讨论】:

    • 虽然一个特别邪恶的类可以实现|= 来做它想做的任何事情。通常,它会以您在此处显示的直观方式实现||=
    • @zzzzBov:是的——在 C++ 中总是有这样的警告;但是如果'a'和'b'是整数,那么我认为你是安全的。如果您使用的类的重载很不稳定并且无法按预期工作,那么是时候修复错误或使用不同的类了。
    • '除了 a 只计算一次' + 1
    • 另一个可能的优势:something[i++].array[--j]-&gt;bitfield |= 23; 定义明确;如果它是手写的,你不能做增量或减量。 OTOH,我不确定这样一个复杂的表达式是不是一个好主意 - 但像 array[i++] |= 0x3C; 这样更简单的表达式是完全合理的。
    • @JonathanLeffler: Boost Serialization 使用&amp; 作为他们的 IO 操作符,与流相似但不同。
    【解决方案2】:
    x |= y
    

    x = x | y
    

    x = x [BITWISE OR] y
    

    【讨论】:

    • 你可以说 C++ 中的任何运算符。即使它并不总是按位或无论如何调用运算符。
    • @Steve -- 并且 + 并不总是添加。
    【解决方案3】:

    这是一个按位或compound assignment

    就像你可以写x += y 来表示x = x + y一样

    您可以将x |= y 写成x = x | y,将xy 的所有位进行或运算,然后将结果放入x

    注意它可以是overloaded,但对于基本类型你应该没问题:-)

    【讨论】:

      【解决方案4】:

      您可以尝试使用SymbolHound: the search engine for programmers 在 SO 之类的网站上搜索此类符号。这是 SymbolHound 上 |= 的 results。 -Tom(联合创始人 SH)

      【讨论】:

      • 非常酷的想法,感谢您完全披露:您与 SH 的关系
      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2011-12-11
      • 2013-06-03
      • 2012-03-03
      • 2013-05-07
      相关资源
      最近更新 更多