没有临时工作的单行交换在Java中不起作用?

时间:2016-10-27 04:10:46

标签: java

我在Java中试过“在没有temp的java中交换变量”,我找到了困扰我的东西:

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

输出显示

2 vs 0


但是,如果我将最左边的作业分开作为单独的陈述:

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

输出

2 vs 3
2 vs 1

现在输出符合预期 在C ++中,从右到左确保评估。就语言规范而言,有什么区别可以说Java可以带来这样的预期结果?

1 个答案:

答案 0 :(得分:3)

根据JLSx ^= y相当于x = (x) ^ (y)(那里还有一个演员阵容,但是如果你正在处理整个投注,那么无论如何都不重要)。所以这个:

b ^= a ^= b ^= a;

相当于

    b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
//      ^^^

在Java中,操作符的参数始终从左到右进行计算。因此,我在上面指出的bb原始值,因为它在分配给b之前进行了评估。正确的表达部分。这意味着表达式等同于

b ^= a;
a ^= b;
b ^= a;   

因为第三个语句使用b new 值作为^的左操作数。