Java中的a ^ = b ^ = a ^ = b似乎是错误的

时间:2014-10-09 12:28:31

标签: java

public class Main
{
    public static void main(String[] args)
    {
        int a,b,c,d;
        a=1;b=2;
        a^=b^=a^=b;
        System.out.println(a+" "+b);
        c=1;d=2;
        c^=d;
        d^=c;
        c^=d;
        System.out.println(c+" "+d);
    }
}

我使用^ b ^ = a ^ = b来交换a和b。但是这个程序的输出是

0 1
2 1

我是Java新手,我不知道为什么a是0.这是我的java运行时环境的错误吗?或者Java中有一些特别的东西我不知道?这是java -version。

java version "1.7.0_65"
OpenJDK Runtime Environment (fedora-2.5.2.5.fc20-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

对不起,这是我关于堆栈溢出的第一个问题......如果我忘了一些规则,请告诉我,谢谢。

2 个答案:

答案 0 :(得分:4)

让我们一起简化

int a = 1;
int b = 2;
a ^= (b ^= (a ^= b));
System.out.println(a + " " + b);

与说

相同
int a = 1;
int b = 2;
int a_tmp = a;
a = a_tmp ^ (b ^= (a ^= b));
System.out.println(a + " " + b);

您的代码假设我们在^ =(b ^ =( a ^ = b a ^ = (b ^ =(a ^ = b)) >))但那是错的。我真的不知道它会在哪里工作。但正如@duffymo指出的那样,不要在家里试试。

答案 1 :(得分:0)

确保查看您的操作顺序。这可能是正在发生的事情:

true ^ true = false  
true ^ false = true 
false ^ true = true 
false ^ false = false

a^=b^=a^=b;

从右到左工作:0001 ^ 0010 ^ 0001 ^ 0010取第2个最右边 0001 ^ 0010 = 0011.现在继续向左移动你的答案与下一个元素0010 ^ 0011 = 0001现在再向左移动一次。 0001 ^ 0001 = 0000所以a = 0000或0  现在拿b表达式: 0010 ^ 0001 ^ 0010现在从右到左做同样的事情。 0001 ^ 0010 = 0011现在向左移动0010 ^ 0011 = 0001所以b = 0001或1.所以当你打印a = 0000或0和b = 0001或1.这是按位异或运算一定要查看顺序仔细操作。