或赋值运算符 (|=) 如何工作? (C#)
How does the or-assignment operator (|=) work? (C#)
我看到 documentation and answers (1) (2) 试图解释 |= 运算符是什么以及它是如何工作的,虽然它在基本层面上有点道理......我不太明白为什么或者它是如何完成它的工作的。
解释说a |= b
等价于a = a | b
,但我不明白它如何评估是否给a
本身的价值(a
) 或 b
的值。根据我的理解,"or" 意味着它 可以是 两个事物之一,但没有指定它是两个事物中的哪一个。
在 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
接受一个布尔值?那么使用条件 (? :) 运算符呢? |= 与那个相比如何(如果有的话)?
|
是 BITWISE OR 运算符,它不是 BOOLEAN OR 运算符。
假设你有两个 8 位二进制数 10110100 和 11000101。
如果你对它们进行按位或操作,你会在第一个或第二个输入中设置位的每个位置的输出中设置一个 1
位,并且在 NEITHER 中设置一个 0
位设置了两个输入位中的一个:
10110100
11000101
--------
11110101
仅此而已。
如您所知,x |= y;
与 x = x | y;
完全相同。
最后要注意的一点是 bool
被视为一个一位数字,其中 1
= true 且 0
= false,为了 |
和 &
应用于 bool
.
的按位运算
但是请注意,您不能混合使用 bool
和 int
位运算。例如,下面会给出一个编译错误:
bool t = true;
bool f = false;
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int'
附录:
人们将 &=
和 |=
用于 bool
而不是看起来更合乎逻辑(双关语) &&=
和 ||=
的原因是后两个运算符实际上并不存在!
我看到 documentation and answers (1) (2) 试图解释 |= 运算符是什么以及它是如何工作的,虽然它在基本层面上有点道理......我不太明白为什么或者它是如何完成它的工作的。
解释说a |= b
等价于a = a | b
,但我不明白它如何评估是否给a
本身的价值(a
) 或 b
的值。根据我的理解,"or" 意味着它 可以是 两个事物之一,但没有指定它是两个事物中的哪一个。
在 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
接受一个布尔值?那么使用条件 (? :) 运算符呢? |= 与那个相比如何(如果有的话)?
|
是 BITWISE OR 运算符,它不是 BOOLEAN OR 运算符。
假设你有两个 8 位二进制数 10110100 和 11000101。
如果你对它们进行按位或操作,你会在第一个或第二个输入中设置位的每个位置的输出中设置一个 1
位,并且在 NEITHER 中设置一个 0
位设置了两个输入位中的一个:
10110100
11000101
--------
11110101
仅此而已。
如您所知,x |= y;
与 x = x | y;
完全相同。
最后要注意的一点是 bool
被视为一个一位数字,其中 1
= true 且 0
= false,为了 |
和 &
应用于 bool
.
但是请注意,您不能混合使用 bool
和 int
位运算。例如,下面会给出一个编译错误:
bool t = true;
bool f = false;
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int'
附录:
人们将 &=
和 |=
用于 bool
而不是看起来更合乎逻辑(双关语) &&=
和 ||=
的原因是后两个运算符实际上并不存在!