【问题标题】:x<<y>>z order of evaluation in CC 中的 x<<y>>z 求值顺序
【发布时间】:2012-09-24 14:08:54
【问题描述】:

x&lt;&lt;y&gt;&gt;z 的情况下,C 中的评估顺序是什么?是 (x&lt;&lt;y)&gt;&gt;z 吗,因为从左到右的关联性?

编辑 需要知道标准说明了什么,而不是通过检查特定编译器来猜测发生了什么。

【问题讨论】:

  • 你试过了吗?你得到了什么?
  • @AurelioDeRosa:在这里试过:msdn.microsoft.com/en-us/library/2bxt6kc4.aspx。但我对这行感到困惑:“操作顺序不是由语言定义的”
  • @AurelioDeRosa:即使您尝试过,您如何知道/证明您的编译器符合标准?
  • @VladLazarenko 更糟糕的是,它可能完全符合标准,并且表达式调用了未定义或实现定义的行为。
  • 注意:如果您不确定顺序,总是使用括号。即使你弄清楚它的作用,下一个开发者也会面临同样的问题。

标签: c evaluation


【解决方案1】:

是的,&gt;&gt;&lt;&lt; 是左关联的并且具有相同的优先级,因此 x &lt;&lt; y &gt;&gt; z 等效于 (x &lt;&lt; y) &gt;&gt; z

【讨论】:

    【解决方案2】:

    Online C 2011 Draft Standard (N1570)

    6.5.7 移位运算符 语法 1 移位表达式加法表达式 移位表达式 加法表达式 移位表达式 >> 加法表达式

    语法表明两个运算符都是左结合的,如下:

    x > z | | | | +------ + ------+ | | | | | 五 |五 移位表达式 >> 加法表达式

    【讨论】:

      【解决方案3】:

      是的,你是对的,因为 > 运算符有 same precendence and are left-associative

      【讨论】:

        【解决方案4】:

        &lt;&lt;&gt;&gt; 都在同一层,方向是从左到右。

        所以它将是(x&lt;&lt;y)&gt;&gt;z

        更多参考.. http://msdn.microsoft.com/en-us/library/2bxt6kc4%28v=vs.71%29.aspx

        【讨论】:

          【解决方案5】:

          是的,但我认为分两步执行更安全,例如 x&lt;&lt;y 然后 y&gt;&gt;z 因为编译器可能会错误地解释 x&lt;&lt;y&gt;&gt;z。我一直没有使用按位运算,但如果我记得很清楚,这就是我所说的。希望对你有所帮助。

          【讨论】:

          • 感谢编辑,没有看到我的错误。对不起,OP。
          • 编译器不能很好地解释它(错误的可能性接近 0,评估顺序是一个非常基本的东西)
          • 我也看到过这个错误(不知道我脑子里发生了什么)
          猜你喜欢
          • 1970-01-01
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          相关资源
          最近更新 更多