【问题标题】:Confusing operator precedence: a << b + c << d混淆运算符优先级:a << b + c << d
【发布时间】:2013-04-11 15:44:06
【问题描述】:

运算符 + 在 C++ 中的优先级高于 &lt;&lt;,这意味着表达式 a &lt;&lt; b + c &lt;&lt; d 应计算为:

a << (b + c) << d

但那没有意义。跟随会更有意义

a << (b + (c << d))

但这违反了+ 优先于&lt;&lt;,不是吗?编译器如何评估“是否有意义”部分?

更新:在问这个问题时,我认为编译器使用了第二个变体,这就是为什么我想知道编译器是如何进行此评估的。事实上,使用了第一个并且是正确的。

【问题讨论】:

  • link says + has higher precedence then << 记住 + 是数学运算符,而
  • 编译器没有任何意义,他们只是编译
  • 除了大卫的回答/和我的第一条评论,--例如:在任何编程语言中,你都找不到 +* 具有更高的优先级,乘法编译器不会中断规则。
  • 为什么不从左到右:(((a &lt;&lt; b) + c) &lt;&lt; d)

标签: c++ operator-precedence


【解决方案1】:

“有意义”是主观的。这就是为什么编译器不评估“意义”,而是基于一组规则的语法。因为&lt;&lt; 具有更高的优先级(由这些规则集给出),所以它将表达式计算为

 a << (b + c) << d

如有疑问,请使用括号。

【讨论】:

  • 哦,亲爱的。不知何故,我错过了这也是有效的。只是(a &lt;&lt; (b + c)) &lt;&lt; d。谢谢。
  • @Luchian 你搞错了。 + 具有更高的优先级。
【解决方案2】:

编译器不考虑有意义。他们只是遵守规则。

制定规则的是语言的设计者,他们通常会尝试制定这些规则以使它们有意义。当然,在一个人看来是明智的,在另一个人看来却是奇怪的。真的没有办法。

【讨论】:

    【解决方案3】:

    operator &lt;&lt; 的优先级低于operator +。见wikipedia

    编译器不会试图理解是否有任何意义。他们只是遵循语法规则。要真正了解为什么左移的优先级低于加号,您可能应该问问丹尼斯·里奇的鬼魂。

    除此之外,如果一个语法想要给出你想要的优先级,它应该以 相同 的优先级(以及从左到右的关联性)进行左移和加移。

    但是,如果您想到这样的用例:

    unsigned int a, b, mid;
    ...
    mid = a + b >> 1;
    

    那么首先计算a + b 是非常有意义的。所以我认为最初设计 C 时,他们决定移位是在普通数学运算之后。


    在 C++ 中,这甚至让事情变得更舒服。现在的样子,你可以这样写:

    cout << a + b << endl;
    

    不需要括号。虽然这只是一个愉快的巧合,并且与这些优先级的原始原因没有任何关系。

    【讨论】:

      【解决方案4】:

      在这种情况下,编译器会寻找最高优先级的运算符并计算相应的运算。它命中 + 和 sum b & c。然后剩下两个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 2015-01-04
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多