利用赋值运算符和加减来实现两个数互换: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



