And*_*i N 8 c++ java puzzle swap xor
示例代码
int a=3;
int b=4;
a^=(b^=(a^=b));
Run Code Online (Sandbox Code Playgroud)
在c ++中它交换变量,但在java中我们得到a = 0,b = 4为什么?
Gre*_*ill 17
通过在一个语句中编写swap,您依赖于内部a^=b表达式相对于外部a^=(...)表达式的副作用.您的Java和C++编译器的工作方式不同.
为了正确进行xor交换,您必须至少使用两个语句:
a ^= b;
a ^= (b ^= a);
Run Code Online (Sandbox Code Playgroud)
但是,交换变量的最佳方法是使用临时变量以平凡的方式进行,并让编译器选择实际执行它的最佳方法:
int t = a;
a = b;
b = t;
Run Code Online (Sandbox Code Playgroud)
在最好的情况下,编译器将生成完全没有代码针对上述交换,并就干脆开始把持有的寄存器a和b周围的其他方式.你不能编写任何根本没有代码的棘手的xor代码.
这也不能保证在C++中工作.这是未定义的行为.
你应该用三个单独的陈述来做:
a ^= b;
b ^= a;
a ^= b;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5221 次 |
| 最近记录: |