【问题标题】:Why does 10>>2+5>>2 evaluate to zero?为什么 10>>2+5>>2 的计算结果为零?
【发布时间】:2015-01-05 11:56:32
【问题描述】:

考虑以下代码:

int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);

运行时,(令人惊讶的)输出为 0。

为什么会这样?

【问题讨论】:

    标签: java operators


    【解决方案1】:

    考虑到Java的operator precedence(特别是+的优先级高于>>)和关联规则,表达式等价于

    (a >> (2 + b)) >> 2
    

    (10 >> (2 + 5)) >> 2
    

    这是零。

    如果您需要在加法之前发生移位,请将它们括起来:

    (a >> 2) + (b >> 2)
    

    【讨论】:

      【解决方案2】:

      因为这就像写(Operator Precedence)

      (a >> (2 + 5)) >> 2
      

      这就像写作:

      (10 >> 7) >> 2
      

      哪个是 0。为什么?

      想想 10 的二进制表示,假设是 8 位:

      00001010
      

      现在,将其右移 7,您将得到 0。将其右移 2,您仍将得到 0。

      【讨论】:

        【解决方案3】:

        运算符优先级!

        如果您的代码可以以不同的方式解释,那几乎肯定有朝一日。始终使用方括号 - 永远不要依赖运算符优先级。

            int a = 10, b = 5;
        
            int c = a >> 2 + b >> 2;
            System.out.println(c);
            int d = (a >> 2) + (b >> 2);
            System.out.println(d);
            int e = ((a >> 2) + b) >> 2;
            System.out.println(e);
            int f = a >> (2 + b) >> 2;
            System.out.println(f);
        

        打印

        0
        3
        1
        0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-26
          • 2022-11-19
          • 2021-05-25
          • 2014-03-19
          • 1970-01-01
          相关资源
          最近更新 更多