码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-23 11:46:56      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:运行   class   大小   顺序   括号   遇到   第三方   情况下   空间   

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

 

今天百度了一下

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

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

 

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

 

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

标签:运行   class   大小   顺序   括号   遇到   第三方   情况下   空间   

原文地址:https://www.cnblogs.com/JamesHao/p/11725067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!