不带temp的单行交换在Java中不起作用?
我在java中尝试了“在java中交换变量而不使用临时变量”,我发现了一些困扰我的问题:不带temp的单行交换在Java中不起作用?,java,Java,我在java中尝试了“在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 + "
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可以导致这样的预期结果?根据,
x^=y
相当于x=(x)^(y)
(这里也有一个cast,但如果你处理的是int,cast无论如何都不重要)。因此:
b ^= a ^= b ^= a;
相当于
b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^
b ^= a;
a ^= b;
b ^= a;
在Java中,运算符的参数总是从左到右求值。因此,我在上面指出的b
是b
的原始值,因为它是在表达式右侧的b
赋值之前计算的。这意味着表达式与
b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^
b ^= a;
a ^= b;
b ^= a;
由于第三条语句使用b
的new值作为^
的左操作数,因此,x^=y
相当于x=(x)^(y)
(其中还有一个强制转换,但如果处理的是int,强制转换无论如何都不重要)。因此:
b ^= a ^= b ^= a;
相当于
b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^
b ^= a;
a ^= b;
b ^= a;
在Java中,运算符的参数总是从左到右求值。因此,我在上面指出的b
是b
的原始值,因为它是在表达式右侧的b
赋值之前计算的。这意味着表达式与
b = (b) ^ (a = (a) ^ (b = (b) ^ (a)));
// ^^^
b ^= a;
a ^= b;
b ^= a;
因为第三条语句使用b
的new值作为^
的左操作数