【问题标题】:Operator precedence (bitwise '&' lower than '==')运算符优先级(按位 '&' 低于 '==')
【发布时间】:2011-01-13 20:48:09
【问题描述】:

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

【问题讨论】:

  • 因为他们就是这样设计的。此外,括号很便宜。
  • 为什么它对你没有意义?
  • 我在使用表达式 if (a & b == c) 时被抓住了,我花了一段时间才弄清楚它为什么不起作用。

标签: c bitwise-operators operator-precedence


【解决方案1】:

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

&& 和 ||运算符是后来添加的 因为他们的“短路”行为。丹尼斯·里奇承认 回想一下,位运算符的优先级应该有 添加逻辑运算符时已更改。但与几 那时存在数百千字节的 C 源代码,并且 三台计算机的安装基数,丹尼斯认为它太大了 C语言的变化...

所以,这可能是一个原因?我猜是因为有好几层位优先级(与关系比较不同),所以它从......永远......一直存在......而且从未被纠正过。

【讨论】:

  • 那句话实际上被错误引用了。 Dennis Ritchie 在他的论文“Chistory”中亲自解释了这一点,you can read here。在我看来,里奇的措辞要好得多。 Ritchie 对拥有这样的优先权感到遗憾,但是当他第一次形成 C 语言时,它与 C 的前身 B 语言的转换摩擦最小。 B 仅支持单元格上的 & 并且由于 B 缺少类型系统而没有显式的布尔运算符。这也解释了为什么“真”意味着“非 0”——按位与并不总是产生完美的 1。
  • 但是== 不是短路运算符,那么为什么这会回答这个问题呢?但是,谢谢@Qix,因为您的评论还解释了为什么按位运算符都有不同的(看似任意的)优先级 - 它们来自 B,如 B Tutorial Appendix D 所示(一个问题烦我)。 (而且我的猜测是,B 这样做没有其他原因,只是很容易用这种表达式语法编写递归下降解析器。)
【解决方案2】:

回想起来,这对丹尼斯·里奇来说也没有意义。

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

&& 和 ||在 | 之后被添加到语言中和 &,出于兼容性的原因,保持了优先级。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 这没有任何意义。在这种情况下,为什么要使用按位运算符而不是逻辑运算符?
    • @Nathan Fellman- Caladain 的回答似乎一针见血。
    • 对。 &| 的优先级作为逻辑运算符非常有意义,但作为位运算符意义不大。
    • 感谢这种令人敬畏的非短路逻辑运算符的使用。从来没想过。
    • @NathanFellman 如果你真的需要aaaa()bbbb() 来运行并且你喜欢不可读的代码,你会写if (aaaa() == 1 & bbbb() == 0)。真的没有别的原因了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2011-07-07
    • 2019-06-10
    相关资源
    最近更新 更多