Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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
为什么使用xor进行交换在c+中工作良好+;但是在java中没有';T一些谜题_Java_C++_Puzzle_Swap_Xor - Fatal编程技术网

为什么使用xor进行交换在c+中工作良好+;但是在java中没有';T一些谜题

为什么使用xor进行交换在c+中工作良好+;但是在java中没有';T一些谜题,java,c++,puzzle,swap,xor,Java,C++,Puzzle,Swap,Xor,可能重复: 示例代码 int a=3; int b=4; a^=(b^=(a^=b)); 在C++中,它交换变量,但是在爪哇中,我们得到了a=0,b=4,为什么?< /p> < p>这也不能保证在C++中工作。这是未定义的行为 您应该在三个单独的语句中执行此操作: a ^= b; b ^= a; a ^= b; a ^= b; a ^= (b ^= a); 通过在一条语句中编写swap all,您依赖于内部a^=b表达式相对于外部a^=(…)表达式的副作用。你的java和C++编译器

可能重复:

示例代码

int a=3;
int b=4;
a^=(b^=(a^=b));

<>在C++中,它交换变量,但是在爪哇中,我们得到了a=0,b=4,为什么?< /p> < p>这也不能保证在C++中工作。这是未定义的行为

您应该在三个单独的语句中执行此操作:

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

通过在一条语句中编写swap all,您依赖于内部
a^=b
表达式相对于外部
a^=(…)
表达式的副作用。你的java和C++编译器做的事情不同。

为了正确执行xor交换,必须至少使用两条语句:

a ^= b; 
b ^= a;
a ^= b;
a ^= b; 
a ^= (b ^= a);
但是,交换变量的最佳方式是使用临时变量以普通方式进行交换,并让编译器选择实际交换变量的最佳方式:

int t = a;
a = b;
b = t;

在最好的情况下,编译器将不为上述交换生成任何代码,只需开始处理包含
a
b
的寄存器。你不能编写任何比没有代码更复杂的异或代码。

在这样高的层次上应该避免这种情况:注意,“正确地进行异或交换”在边缘情况下不起作用,因为
a
b
是同一个变量。+1是交换变量的更理想的方式。下面这句话怎么样:a=(b^=a^=b)^a;因为副作用在Java中是有序的,所以这应该是可行的。原因是严格来说,在两个序列点(例如a;)之间,一个变量可能不会更改多次,以免出现未定义的行为