不使用第三方变量交换变量遇到的思考

记一次在不使用第三方变量的情况下交换变量遇到的思考

 

今天百度了一下

在不使用第三方变量的情况下交换变量的几种方法

对其中的一种交换变量的方法特别感兴趣,看起来比较简单,但是琢磨了半天没有想明白他是按什么顺序去运行的 :

 

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          */

 

posted @ 2019-10-23 10:57  詹庆豪  阅读(225)  评论(0编辑  收藏  举报