我在类似 C 的语言中遇到过几次问题是这样的:
original | included & ~excluded // BAD
由于优先级,这解析为:
original | (included & ~excluded) // '~excluded' has no effect
有谁知道按位运算符的三个不同优先级的原始设计决策背后的原因是什么?更重要的是,你是否同意这个决定,为什么?
我在类似 C 的语言中遇到过几次问题是这样的:
original | included & ~excluded // BAD
由于优先级,这解析为:
original | (included & ~excluded) // '~excluded' has no effect
有谁知道按位运算符的三个不同优先级的原始设计决策背后的原因是什么?更重要的是,你是否同意这个决定,为什么?
至少从C开始,运算符就具有此优先级。
我同意这个顺序,因为它与算术运算符的相对顺序相同,它们最类似于 (+
和*
否定)。
&
你可以在这里看到vs*
和|
vs的相似性+
:
AB | A&B A*B | A|B A+B 0 0 | 0 0 | 0 0 0 1 | 0 0 | 1 1 1 0 | 0 0 | 1 1 1 1 | 1 1 | 1 2
按位非和否定的相似性可以通过这个公式看出:
~A = -A - 1
为了扩展 Mark Byers 的答案,在布尔代数(电气工程师广泛用于将逻辑电路简化为最小数量的门并避免竞争条件)中,传统是按位与优先于按位或。C只是遵循这个既定的传统。请参阅http://en.wikiversity.org/wiki/Boolean_algebra#Combining_Operations:
就像在普通代数中一样,乘法优先于加法,AND 优先于(或优先于)OR。