栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA一行代码实现整型int互换的原理:b = a+b - (a=b);、a = b + (b = a) * 0;

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA一行代码实现整型int互换的原理:b = a+b - (a=b);、a = b + (b = a) * 0;

利用赋值运算符和加减来实现两个数互换:b = a+b - (a=b);
利用赋值和加乘来实现两个数互换:a = b + (b = a) * 0;

代码原理推理过程:在 idea 中执行下面一行代码,会出现反应1、2
b = b + (b = a);
1、idea 提示(非报错):第二个 b 没反应,第三个 b 显示The value a assigned to ‘b’ is never used
简称: b 从未被使用过
简称:…由"int c; c = 6; 后续无 c 的调用;" 中的第二个 c 会报相同的提示得出

2、idea 提示(非报错):第一个 b 显示The value b + (b = a ) assigned to ‘b’ is never used

但如果在该代码下方写入System.out.println(b); 则上方的 2 将会消失
这说明该式子中的三个 b 都是不同的东西,第二个 b 没反应是因为它是最开始时 int b = 10; 的调用。
第一个 b 有反应是因为它是一个新东西,并且其在下方没有被调用过所以出现反应(这也是在下方加了System.out.println(b);后提示消失的原因)
第三个 b 有反应说明它也属于是一个新建的东西,在下方没有被调用过所以出现提示。
结论:所有被赋值的变量都是新创建出的
这就解释了为什么 b 在被赋值为 a 后再和 b 相加时本质为 b + a 而非 a + a。
但是为什么同一个变量名称会有三种不同的意义:
由System.out.println(b); 令 2 消失可得出该行代码执行完后活下来的是第一个 b,后两个 b 全消失了
(第二个 b 不一定消失,因为其前有相同的东西导致其没出现提示。在存在第二个 b 的情况下第一个 b 出现了提示可能只是因为代码执行前第一个 b 是新创建出的?代码执行完后这俩 b 就相等了)
原因:实际上,变量 b 是不存在的,编译之后并未保留任何变量名,只有地址,你可以把 b 当个内存地址看待。也就是执行到 int b = 3; 时先分配一内存块,同时将3写入。
最终结论:这是编译器导致的,换成c++就不一定可以。

同理:
a = a + b - (b = a)
a = a * b / (b = a)
还有特别点的:
a = b + (b = a) * 0
a = a ^ b ^ (b = a)

对 b = a+b - (a=b); 编译后,再反编译,看到的是如下代码:
int x = a + b
b = a
a = x - a

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号