我在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可以带来这样的预期结果?
答案 0 :(得分:3)
根据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
的 new 值作为^
的左操作数。