我在类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以来就具有这种优先级。
我同意这个顺序,因为它与它们最相似的算术运算符的相对顺序相同(+
、*
和否定)。
你可以在这里看到 &
和 *
的相似性,以及 |
和 +
的相似性:
A B | 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
就像在普通代数中,乘法优先于加法一样,AND优先(或优先)于OR。
^
在*
下面、在|
上面,这有点随意但也是合理的。不幸的是,在 C 语言中,二进制位运算符的优先级比比较运算符低,因此需要像(status & MASK) != MASK
这样的表达式来要求额外的括号。 - RBerteigA|B & A|C == A | (B&C)
。但我会说按位运算的用例与布尔运算的用例远远不同(其优先级对我来说非常合理)。你会看不起一个将所有按位运算符优先级定义为相同的语言吗?(为什么?) - zildjohn01