记一次在不使用第三方变量的情况下交换变量遇到的思考
今天百度了一下
在不使用第三方变量的情况下交换变量的几种方法
对其中的一种交换变量的方法特别感兴趣,看起来比较简单,但是琢磨了半天没有想明白他是按什么顺序去运行的 :
1 public static void main(String[] args) {
2 int a = 1000,b=2000;
3
4 a= b + ( b = a ) * 0;
5
6 System.out.println("a:" + a + " b:" + b);
7
8 }
结果为
1 a:2000 b:1000
纠结了一晚上,不知道他的执行过程
最后在查看反编译文件时发现很简单
1 public static void main(String[] args) {
2 int a = 1000;
3 int b = 2000;
4 //这时他不是在系统默认开辟int类型的空间,而是根据
5 //你定义的b的大小自动为你匹配类型来开辟内存空间!
6 short var10000 = b;
7 int b = a;
8
9 int a = var10000 + a * 0;
10
11 PrintStream var3 = System.out;
12
13 a.println((String)b);
14
15 }
但(b=a)一定要放在a=b的右边
因为程序在编译时会(b=a)前的值抽取出来放到第三方变量,然后就开始运算括号内的赋值
如
1 a = ( b = a ) * 0 + b ;
2 //a = ( b = 1000 ) * 0 + 1000 此时后面的b已经是1000了
3 /*
4 碰到括号然后碰到等号,先赋值运算
5 此时b=a=1000
6 然后再*0+b,返回给a
7 结果就是a=2000,b=1000
8 */
那么正常情况
1 a = b + ( b = a ) * 0;
2 //a = 2000 + ( b = 1000 ) * 0;
3 /*
4 编译先赋值碰到括号和=号
5 就会先赋值完成后直接运算括号内的内容
6 所以a=2000+(b=1000)*0;
7 因为括号优先级运算更高
8 所以这时b=1000已经全部赋值完了
9 再执行括号外的表达式
10 结果就是a=2000,b=1000
11 */