不使用第三方变量交换变量遇到的思考
记一次在不使用第三方变量的情况下交换变量遇到的思考
今天百度了一下
在不使用第三方变量的情况下交换变量的几种方法
对其中的一种交换变量的方法特别感兴趣,看起来比较简单,但是琢磨了半天没有想明白他是按什么顺序去运行的 :
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 */