0

我已经看到文档和答案(1) (2)试图解释 |= 运算符是什么以及它是如何工作的,虽然它在基本层面上是有意义的......我不太明白为什么或它如何完成它的工作。

解释说这a |= b相当于a = a | b,但我不明白它是如何评估是给出a自身的值(a)还是 的值b。根据我的理解,“或”意味着它可以是两件事之一,但没有指定它是两件事中的哪一个。

在 Visual Studio 中,我使用了一个名为 Refactoring Essentials 的扩展,它建议我用带有 |= 运算符的行替换我的一些代码,虽然代码与其中的运算符一起工作,但我不知道它是如何完成的,这就是促使我尝试在线研究它的原因(因此,提出了这个问题)。

我的代码来自

if (MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No)
{
    e.Cancel = true;
}

e.Cancel |= MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No;

它仍然有效。虽然我猜这e.Cancel是根据 的评估确定的MessageBox.Show(...) == MessageBoxResult.No,但我不知道为什么需要 |= 运算符。为什么不直接使用标准赋值 (=) 运算符,因为表达式的结果是布尔值并e.Cancel采用布尔值?那么使用条件 (? :) 运算符呢?|= 与它相比如何(如果它甚至如此)?

4

1 回答 1

7

|是 BITWISE OR 运算符,它不是 BOOLEAN OR 运算符。

假设您有两个 8 位二进制数 10110100 和 11000101。

如果您按位或它们,您将1在输出中为每个位置设置一个位,在第一个或第二个输入中设置一个0位,以及两个输入位均未设置的位:

10110100 
11000101
--------
11110101

这里的所有都是它的。

如您所知,x |= y;x = x | y;.

最后要注意的一点是,bool它被视为一个位数,其中1= true 和= 0false,用于.|&bool

但是,请注意,您不能混合boolint按位运算。例如,以下将给出编译错误:

bool t = true;
bool f = false;
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int'

附录:

人们使用&=and|=bool不是看起来更合乎逻辑(双关语)&&=||=原因是后两个运算符实际上并不存在!

于 2016-04-26T09:38:47.667 回答