按位运算符

zil*_*n01 3 language-design bitwise-operators operator-precedence

我在C语言中遇到过几次问题:

original | included & ~excluded   // BAD
Run Code Online (Sandbox Code Playgroud)

由于优先级,这解析为:

original | (included & ~excluded)   // '~excluded' has no effect
Run Code Online (Sandbox Code Playgroud)

有没有人知道按位运算符的三个独立优先级的原始设计决策背后是什么?更重要的是,你同意这个决定,为什么?

Mar*_*ers 7

至少从C开始,运营商就具备了这一优先权.

我与顺序不一致,因为它是相同的相对顺序算术运算符,他们是最相似的(相对顺序+,*并否定).

你可以看到&vs *|vs 的相似之处+:

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

  • 你可以注意到`^`低于`*`和高于`|`,这有点武断但合理.C中令人遗憾的选择是使二进制位运算符的优先级低于需要表达式(例如`(status&MASK)!= MASK`)的比较运算符,以便需要额外的括号. (3认同)