Java中"x += y"和"x = x+y"会产生不同的结果

5

我想到了两个表达式来将位运算的值赋给一个变量,并且注意到在这种情况下,“x+=y”和“x=x+y”的结果是不同的:

public void random () 
{
        int n =     43261596;
        System.out.println(Integer.toBinaryString(n));
        n = n + 0&1; //binary representation of n is 0
        //n += 0&1;  //result is the same as n
        System.out.println(Integer.toBinaryString(n));
}

我做了一些研究,发现只有在操作数类型不同时,“x+=y”和“x=x+y”的结果才不相同。然而,在这种情况下,“n”是int类型,“0&1”应该也是int类型(根据这个问题:为什么Java中两个short值的按位与运算结果是一个int值?:因为Java语言规范规定非长整型算术的结果始终是一个int)。所以我想知道为什么会产生不同的结果。
3个回答

13

区别在于操作符优先级+ 的优先级高于 &,但是 & 的优先级又高于 +=。因此,你的操作转化为:

n = (n + 0) & 1; // = n & 1 = 0 (when n is even)
n += (0 & 1);    // = n + 0 = n

这里是一个操作符优先级表,供以后参考JavaOperatorPrecedenceTable。好答案,非常清晰简明。 - Rcordoval

5

运算符 & 的优先级低于 +。

实际上您所编写的是:

n = ( n + 0 ) &1;

我加了括号以澄清。

由于 n 是偶数,该表达式的结果为零。


0
在第一种情况下,n将首先0,然后加1。
n = n+0&1 -> n = (n + 0)&1 -> 0
n+=0&1 ->n+=(0&1)->n

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