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

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

2
因为这就是他们设计的方式。而且,括号很便宜。 - CanSpice
为什么这对你来说没有意义? - peoro
21
我在使用表达式 if (a & b == c) 时被卡住了,花了一段时间才发现它为什么不起作用。 - poida
3个回答

54

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

&&和||运算符是后来添加的,因为它们具有“短路”行为。 Dennis Ritchie 回顾时承认,在添加逻辑运算符时应该改变位运算符的优先级。但是在那个时候,已经存在数百千字节的 C 源代码,并且有三台计算机的安装基础,Dennis 认为这将是对 C 语言的太大更改...

所以,这可能是一个原因吗? 我猜想由于有几个位运算符的优先级(不像关系比较),它是存在已久的垃圾,从未被纠正。


5
那句话实际上引用错误了。丹尼斯·里奇在他的论文《Chistory》中自己解释了这个问题,你可以在这里阅读。我认为里奇的措辞更好。里奇后悔先前的优先级设定,但当他最初创建C语言时,为了让B语言转换到C语言时摩擦最小化,必须这样做。B仅支持对单元格进行&操作,并且由于B缺乏类型系统,没有显式布尔运算符。这也解释了为什么“true”意味着“不是0”——位AND并不总是产生完美的1。 - Qix - MONICA WAS MISTREATED
但是==不是一个短路运算符,那么为什么这个答案能回答问题呢?然而,感谢@Qix,因为你的评论也解释了为什么位运算符都有不同(看起来是任意的)优先级 - 它们来自B,如在_B教程附录D_中所见(这一直困扰着我)。 (我的猜测是,B之所以这样做,没有其他原因,只是因为使用这种表达式语法的递归下降解析器很容易编写。) - davidbak

18

5

我没有权威的答案来解释为什么K&R选择了他们所选择的优先级。但有一个例子是比较合理的:

if (x == 1 & y == 0) {
    /* ... */
}

由于这是位“与”运算符,它使用非短路求值模式,就像

if (x == 1 | y == 0) {
    /* ... */
}

使用非短路的OR运算符。这可能是为什么他们选择按照这种方式对优先级组进行排序的原因,但我同意您的看法,回过头来看似乎不是一个好主意。

3
这毫无意义。为什么在这种情况下要使用按位运算符而不是逻辑运算符? - Nathan Fellman
3
@Nathan Fellman的回答似乎恰中要害。 - templatetypedef
2
没错。&| 作为逻辑运算符的优先级是很合理的,但作为位运算符就不太合理了。 - dan04
赞赏这个非短路逻辑运算符的使用,太棒了。从未想过。 - Spidey
如果你真的需要同时运行aaaa()bbbb(),并且你喜欢难以阅读的代码,那么你会写成if (aaaa() == 1 & bbbb() == 0)。实际上没有其他原因。 - user824425

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接