java中x^=y^=x^=y交换整形数据Bug

发布时间:2025-05-19 09:30

从X理论到Y理论的领导风格转变 #生活技巧# #领导力技巧# #领导风格理论#

最新推荐文章于 2025-02-15 02:06:32 发布

_吟游诗人 于 2018-04-19 17:17:24 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

或许不少做过c语言或者c++的朋友都知道,如果是整形数据x和y,通过x^=y^=x^=y ,就可以交换x和y的值。但是如果想在java中这么做,那就哈哈哈哈~这里写图片描述

让我们直接看一下这么做的后果:
这里写图片描述
瞧见了没,y是变成1了,但是x却并不等于2,而是等于0。

首先我们来解析一下,如果通过异或来交换两个整数,其正确流程如下:

x = x ^ y; y = y ^ x; x = y ^ x;123

然而在java中上述表达式实际运行情况又是怎样呢?

int tmp1 = x; int tmp2 = y; int tmp3 = x ^ y; x = tmp3; y = tmp2 ^ tmp3; x = tmp1 ^ y;123456

这是因为在java中,操作符的操作数是从左向右求值的,比如计算x^=expr的值时,在计算expr前先提取x的值,然后将异或的结果赋值给x。因此在上面的式子中,x实际上被提取了两次,但是两次提取都发生在所有的赋值以前,也就是两次提取前,其值是一样的,而这就是错误的源泉。

上面的是不是看的很懵,没关系,看一下改正后的代码,再结合上面的解释就很好理解了,

y=(x^=(y^=x))^y;1

运行截图如下:
这里写图片描述

这里写图片描述

——参考资料《Java解惑》

网址:java中x^=y^=x^=y交换整形数据Bug https://www.yuejiaxmz.com/news/view/998285

相关内容

设函数f(x)满足f(x+y)=f(x)+f(y)+xy(x+y? 爱问知识人
Python中x=y与x==y的区别。(比较简单)
y=x
差分进化算法求函数y(x,y)=3cos(xy)+x+y的最小值
二次函数y=a(x
隐函数求导x^y=y^x,求y'解:原式整理为:ylnx=xln 爱问知识人
x*y=k
求y=2x+4/x
常数变易法标准化方程为y'+P(x)y=Q(x)*用常数变易法求方程(*)的通解:令y=C(x)e^
若关于x的函数y=kx2+2x

随便看看