Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带temp的单行交换在Java中不起作用?_Java - Fatal编程技术网

不带temp的单行交换在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 + "

我在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 + " 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值作为
^
的左操作数