运算符优先级(按位'&'低于'==')

poi*_*ida 39 c bitwise-operators operator-precedence

在C编程语言中,为什么按位运算符(&和|)的优先级低于等于运算符(==)?这对我来说没有意义.

Cal*_*ain 52

你需要问Brian Kernighan或Dennis Ritchie.
来自这个论坛:http://bytes.com/topic/c/answers/167377-operator-precedence

&&和|| 后来因为"短路"行为而加入了运营商.Dennis Ritchie回想起,在添加逻辑运算符时,应该更改位运算符的优先级.但是由于当时存在几百千字节的C源代码,并且安装了三台计算机,Dennis认为C语言的改变太大了......

那么,这可能是一个原因?我猜测,因为有几个按位优先级(与关系比较不同),因为......永远存在......而且从未纠正过.

  • 这句话实际上是错误引用的.Dennis Ritchie在他的论文"Chistory"中解释了这一点,[你可以在这里阅读](http://cm.bell-labs.co/who/dmr/chist.html).在我看来,里奇的措辞要好得多.Ritchie对这样的优先权感到遗憾,但是当他第一次形成C语言时,C语言的前身B语言的转换摩擦很小.B仅支持单元格上的`&`,并且由于B缺少类型系统而没有显式的布尔运算符.这也解释了为什么"true"意味着"不是0" - 按位AND并不总是产生完美的1. (4认同)

Mic*_*ius 16

回想起来,丹尼斯·里奇也没有任何意义.

http://www.lysator.liu.se/c/dmr-on-or.html

&&和|| 在|之后被添加到语言中 和&,并且出于兼容性原因保留了优先级.


tem*_*def 5

对于 K&R 为什么选择他们所做的优先级,我没有权威的答案。一个相当有意义的例子是这个:

if (x == 1 & y == 0) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

由于这是按位 AND 运算符,因此它使用非短路评估模式,就像

if (x == 1 | y == 0) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

使用非短路 OR 运算符。这可能是他们选择以这种方式设置优先组的原因,但我同意你的看法,回想起来这似乎不是一个好主意。

  • 这没有任何意义。在这种情况下,为什么要使用按位运算符而不是逻辑运算符? (3认同)
  • @Nathan Fellman- Caladain 的回答似乎击中了这一点。 (3认同)
  • 对。`&` 和 `|` 的优先级作为逻辑运算符非常有意义,但作为按位运算符意义不大。 (2认同)