java中i++问题的理解
2015-07-06 17:51
597 查看
java中i++问题的理解
下面是代码:for循环遍历20次,将count++的值复制给count,问最后count的结果是多少?
在java中,count=count++,先把count的值存放起来,然后执行count++,接着把之前存放的值复制给count(而不是把count+1后的值复制给count),这样我们看到的就是,无论怎么赋值,count的值始终是当初的默认值。如果是在c语言里面呢,我估计答案会不一样的,据某个同学测试了的,是不一样,我没有测试。
update:in(2015-07-06 21:04:55)进一步来理解,参考了面试宝典上的内容,count=count++这种,属于java用了中间变量缓存机制,我们用一个复杂的例子来理解吧,count=++count + count++ + count++ + count++,这种情况下,我们的执行代码如下:count=1,count=count+ count++ +count++ + count++;具体写为:x=(count+count++),y=(x+count++),z=(y+count++);count=z;就是这样的步骤,我们说一下x=(count+count++),count=1了,x=count+count=2,count自己加1就等于了2;y=(x+count++),y=x+count=2+2=4,count自己加1等于3,z=(y+count++),z=y+count=4+3=7,count自己加1等于4
执行过程为:先count自己加1,然后把自加的结果赋值到count,所以不会保持不变。
接着我们在探讨一下,count=count++换成count=count++ + ++count,那么这样的结果会是多少呢。
在这种情况下,count的执行过程是:先执行最右边的count+1,我们假设count的初始值是0,那么最右边自加1后,结果就变成了,count=1,接着执行count=count+count,这个时候count自身的内容已经有原来的0变成1了,+号前后的count值都是1,这样两部分相加结果就变成了2,第一次的结果也的确是2。
当我们把count=count++换成count=++count + count++呢,这个时候结果如何呢?
结果和上面的这种是一样的,第一次的结果依旧是2,它的执行顺序为:先执行赋=号旁边的++count,也就是让count自己加1,这样count的内容由0变成了1,然后两个1相加,就是所谓的2了。
以上便是我想说的,count=count++;可能有人疑问,为什么count后缀加1没有赋值到count中去,而前缀加1,修改了count的内容后,可以赋值到count中去。实际上,还是前面加粗文字里面说的,内存会暂时存放先前的,在count=count++中,jvm分析后,count后缀加1,会把原来的count值记录下来,存到某个存储空间中去,赋值到count中,count自己也加了1。而前缀加1的优先级最高,一开始就直接修改了count的内容,jvm语法分析,语义分析,把count的内容赋值给count。通过这样的测试,大致可以说明是这样的过程,毕竟最后的测试结果,多组数据的比对,也应证了我的猜想,当然更深入的,还得看看jvm是怎么分析,处理的。
结果是2,原因嘛,大家就自己分析了。
面试问题分析
上周二面试中,碰到了一个有疑问的笔试题,在这里来详细分析一下,弄清楚问题缘由,解决迷惑,避免再出现同样的问题。下面是代码:for循环遍历20次,将count++的值复制给count,问最后count的结果是多少?
public static void main(String[] args) throws Exception { int count = 0; for (int i = 0; i < 10; i++) { count = count++; // count= ++count; // count=count++ + ++count; // count=++count + count++ ; System.out.println("count==" + count); } System.out.println(count); }
难点疑惑
这道题主要就是考察count=count++在java虚拟机中是怎么执行的,它的先后顺序。在java中,count=count++,先把count的值存放起来,然后执行count++,接着把之前存放的值复制给count(而不是把count+1后的值复制给count),这样我们看到的就是,无论怎么赋值,count的值始终是当初的默认值。如果是在c语言里面呢,我估计答案会不一样的,据某个同学测试了的,是不一样,我没有测试。
update:in(2015-07-06 21:04:55)进一步来理解,参考了面试宝典上的内容,count=count++这种,属于java用了中间变量缓存机制,我们用一个复杂的例子来理解吧,count=++count + count++ + count++ + count++,这种情况下,我们的执行代码如下:count=1,count=count+ count++ +count++ + count++;具体写为:x=(count+count++),y=(x+count++),z=(y+count++);count=z;就是这样的步骤,我们说一下x=(count+count++),count=1了,x=count+count=2,count自己加1就等于了2;y=(x+count++),y=x+count=2+2=4,count自己加1等于3,z=(y+count++),z=y+count=4+3=7,count自己加1等于4
引申内容
当我们把count=count++调整为count=++count,那么内容会是多少呢,结果,会是所谓的1,2,3,4…等。执行过程为:先count自己加1,然后把自加的结果赋值到count,所以不会保持不变。
接着我们在探讨一下,count=count++换成count=count++ + ++count,那么这样的结果会是多少呢。
在这种情况下,count的执行过程是:先执行最右边的count+1,我们假设count的初始值是0,那么最右边自加1后,结果就变成了,count=1,接着执行count=count+count,这个时候count自身的内容已经有原来的0变成1了,+号前后的count值都是1,这样两部分相加结果就变成了2,第一次的结果也的确是2。
当我们把count=count++换成count=++count + count++呢,这个时候结果如何呢?
结果和上面的这种是一样的,第一次的结果依旧是2,它的执行顺序为:先执行赋=号旁边的++count,也就是让count自己加1,这样count的内容由0变成了1,然后两个1相加,就是所谓的2了。
以上便是我想说的,count=count++;可能有人疑问,为什么count后缀加1没有赋值到count中去,而前缀加1,修改了count的内容后,可以赋值到count中去。实际上,还是前面加粗文字里面说的,内存会暂时存放先前的,在count=count++中,jvm分析后,count后缀加1,会把原来的count值记录下来,存到某个存储空间中去,赋值到count中,count自己也加了1。而前缀加1的优先级最高,一开始就直接修改了count的内容,jvm语法分析,语义分析,把count的内容赋值给count。通过这样的测试,大致可以说明是这样的过程,毕竟最后的测试结果,多组数据的比对,也应证了我的猜想,当然更深入的,还得看看jvm是怎么分析,处理的。
引申另外一题
下面有一道题目,和上面类似:public class MyTest { static{ int x=5; } static int x,y; public static void main(String[] args) { x--; myMethod(); System.out.println(x+ y++ + x); } private static void myMethod() { // TODO Auto-generated method stub y= x++ + ++x; } }
结果是2,原因嘛,大家就自己分析了。
相关文章推荐
- ubuntu中安装jdk
- ubuntu中安装jdk
- ubuntu中安装jdk
- Freemarker使用教程-基于Springmvc的Freemarker实例
- java 基础
- Spring.Net集成NHibernate配置
- Selenium_WebDriver下拉框练习_Java
- Mac下添加java环境变量
- mac下在eclipse中如何清除/切换svn
- java decode
- java.util.concurrent
- 《Java事务设计策略》XA事务处理
- Java设计模式之适配器模式
- 给Eclipse、Android Studio插上Vim的翅膀
- 走进Struts2(五)— 值栈和OGNL
- struts2中使用ajax和action读写数据的区别
- Java获取项目路径下的方法(全)
- Java回调机制
- java学习笔记 i++和++i
- mysql/Java服务端对emoji的支持