在C编程语言中,为什么位运算符(& 和 |)的优先级低于等号运算符(==)? 这对我来说没有意义。
你需要向Brian Kernighan或Dennis Ritchie询问。来自这个论坛: http://bytes.com/topic/c/answers/167377-operator-precedence
&&和||运算符是后来添加的,因为它们具有“短路”行为。 Dennis Ritchie 回顾时承认,在添加逻辑运算符时应该改变位运算符的优先级。但是在那个时候,已经存在数百千字节的 C 源代码,并且有三台计算机的安装基础,Dennis 认为这将是对 C 语言的太大更改...
所以,这可能是一个原因吗? 我猜想由于有几个位运算符的优先级(不像关系比较),它是存在已久的垃圾,从未被纠正。
&
操作,并且由于B缺乏类型系统,没有显式布尔运算符。这也解释了为什么“true”意味着“不是0”——位AND并不总是产生完美的1。 - Qix - MONICA WAS MISTREATED==
不是一个短路运算符,那么为什么这个答案能回答问题呢?然而,感谢@Qix,因为你的评论也解释了为什么位运算符都有不同(看起来是任意的)优先级 - 它们来自B,如在_B教程附录D_中所见(这一直困扰着我)。 (我的猜测是,B之所以这样做,没有其他原因,只是因为使用这种表达式语法的递归下降解析器很容易编写。) - davidbak回过头来看,Dennis Ritchie 也觉得这没有意义。
http://www.lysator.liu.se/c/dmr-on-or.html
&& 和 || 是在 | 和 & 后添加到该语言中的,并且出于兼容性考虑保持了优先级。
我没有权威的答案来解释为什么K&R选择了他们所选择的优先级。但有一个例子是比较合理的:
if (x == 1 & y == 0) {
/* ... */
}
由于这是位“与”运算符,它使用非短路求值模式,就像
if (x == 1 | y == 0) {
/* ... */
}
&
和 |
作为逻辑运算符的优先级是很合理的,但作为位运算符就不太合理了。 - dan04aaaa()
和bbbb()
,并且你喜欢难以阅读的代码,那么你会写成if (aaaa() == 1 & bbbb() == 0)
。实际上没有其他原因。 - user824425