JAVA自增陷阱

来源:互联网 发布:facebook翻墙软件 编辑:程序博客网 时间:2024/05/16 17:13

首先明白两个含义i++和++i

  • i++表示的是先赋值后加一
  • ++i表示的是先加一然后赋值(此形式没有任何异议)

但是下面的代码却出现了灵异事件:

//示例一public class Client {public static void main(String[] args){int i= 0;for(int m=0;m<10;m++){i=i++;}System.out.println(i);}}
示例一的输出结果是什么?循环十次加一,结果是10?如果这是你心中的答案,那就大错特错了,再看看下面代码。
//示例二public class Client {public static void main(String[] args) {int i = 0;int b = 0;for (int m = 0; m < 10; m++) {b = i++;}System.out.println(b);}}
示例一的最终结果是0,示例二的最终结果是9。

更可怕了,怎么命名循环了0-9总共十次,怎么结果都与10不搭边。

下面就是解析:

i++是一个表达式,是有返回值的,他的返回值是自加前的值。java对自加是这样处理的:首先把i的值(注意是值,不是引用)拷贝到一个临时变量区,然后对i变量加1,最后返回临时变量区的值。

还很迷糊是吧!一开始我也很疑惑,后来想了想明白了。

简而言之:i++因为要在加一前返回当前值,虚拟机是这样处理的,在临时区中保存当前的值,然后把i值直接加一,那么他返回的值就是临时区中保存的值,也就是相当于加一前的值赋给接受者,这也就是出现上面两种情况的原因。

示例一:i=i++,执行顺序——>先在临时区保存增值前的i值,然后i加一,最后把自增前的临时区所保存的值赋给左侧,但是左侧又是自己本身,相当于又拿自己自增前的值覆盖掉了自增后的值(相当于没有改变值)。

实例二:a=b++,执行顺序——>先在临时区保存b增值前的值,然后b加一,然后把临时区保存的值赋给a,所以循环的第一次a的值还是0,虽然循环了十次,但是每一次都是把增值前的值赋给a,循环了十次b最后变为10,那么最后增值前的值当然是9了。

如何避免实例一所造成的问题呢?

将i=i++改为i++。

注意:在C++中不会出现这种情况,最终结果都是10。也就是说“i=I++与i++”最后的结果是相同的。


********************************************************************************结束语********************************************************************************************
  我在写这篇博客的时候也是一名初学者,有任何疑问或问题请留言,或发邮件也可以,邮箱为:577328725@qq.com,我会尽早的进行更正及更改。
在我写过的博客中有两篇博客是对资源的整理,可能对大家都有帮助,大家有兴趣的话可以看看!!
下载资料整理——目录:http://blog.csdn.net/fanxiaobin577328725/article/details/51894331
  这篇博客里面是我关于我见到的感觉不错的好资源的整理,里面包含了书籍及源代码以及个人搜索的一些资源,如果有兴趣的可以看看,我会一直对其进行更新和添加。
优秀的文章&优秀的学习网站之收集手册:http://blog.csdn.net/fanxiaobin577328725/article/details/52753638
  这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
********************************************************************************感谢********************************************************************************************

0 0