A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁小波 中级黑马   /  2012-11-18 20:12  /  1342 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

之前有个同学发了一个关于“颠覆你思维的帖子”;主要说的有1.java的浮点运算的不精确。2交换a,b的值!
关于交换a,b的值一直没有想明白为什么?上代码
  1. int a=2;
  2. int b=1;
  3. <blockquote>a=b+0*(b=a);
复制代码
首先你看到后,想一下ab到底是多少?a=b+0*(b=a);你会想应该先是b=a;之后呢,a=b?然后是不是应该a=b=1?
如果你是这么想的好吧,这个帖子会为你解答为什么是a,b交换。
1.首先我们想一下a=b+0*(b=a);表达式是怎么样在内存中执行的。由于第一个=后面先执行,所以会有b压栈,也就是说b先压栈了!1是在栈中!然后进行了b=a。由于后面值为0;所以表达式出栈的时候会有a=1;会交换了;
2.你不相信,好样的!你可以换一下a=0*(b=a)+b;这样先进行的是b=a;于是你会发现a=b=2!
3.到了这儿,我想会有人说,在栈中是1,为什么不是变量b?我想在jvm设计的时候的问题吧。我试了一下在c/c++下。
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int a=2;
  5.         int b=1;
  6.         a=0*(b=a)+b;
  7.         printf("%d----%d",a,b);
  8. }
复制代码
无论怎么样都不会出现交换!我想这是编译器的设计逻辑不同吧!
              1.在java中表达式在栈中是一个实值。2.在c/c++中还是变量!
4.那么再次举一个例子
  1. int a=2;
  2. int b=1;               
  3. a=b+(b=3);
复制代码
这样a=4;你不会在认为栈中是变量了吧!
总结:在我们进行分析时要多去考虑jvm的处理细节才会、更好的理解代码。另外一点,这个关于交换代码,要根据你的代码环境而言。不是什么语言都通用的!
本文均为个人观点,如有意见或错误,及时给我纠正!谢谢。



评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
顶一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马