我在java中尝试了“在Java中交换变量而不使用temp”,我发现了一些让我困扰的东西:
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可以引领这样的预期结果?
发布于 2016-10-27 12:20:12
根据JLS的说法,x ^= y等同于x = (x) ^ (y) (其中也有一个强制转换,但如果您处理的是整数,那么强制转换无论如何都无关紧要)。所以这就是:
b ^= a ^= b ^= a;等同于
b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^在Java中,运算符的参数总是从左到右进行计算。因此,我在上面指出的b是b的原始值,因为它是在向表达式右侧的b赋值之前计算的。这意味着该表达式不等同于
b ^= a;
a ^= b;
b ^= a; 因为第三条语句使用的新值b作为^的左操作数。
https://stackoverflow.com/questions/40275969
复制相似问题