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
这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
********************************************************************************感谢********************************************************************************************
- Java 自增陷阱
- JAVA自增陷阱
- Java的自增陷阱
- java警惕自增的陷阱
- Java学习笔记----自增陷阱
- java自增策略小陷阱
- Java 自增自减运算符陷阱
- Java自引用以及陷阱
- 警惕自增的陷阱
- 警惕自增的陷阱
- 变量自增的陷阱
- c和Java在自加上的陷阱
- 看到一道有意思的题目——自增陷阱
- Java 陷阱
- java陷阱
- WinRAR自解压程序陷阱
- java自增自减
- java自增自减
- hdu 1251 统计难题
- android调用webservice带soapheader验证
- android开发环境
- Java finally语句到底是在return之前还是之后执行?
- 说说TDD的好处和坏处-对话
- JAVA自增陷阱
- ISO C++11 doesn't allow conversion from string literal to 'char*'
- 互联网语言与文化
- servlet/filter/listener/interceptor区别与联系
- 说说JSON和JSONP
- zabbix agent 类型所有key
- 关于opencv的“Bad flag (parameter or structure field)...“
- leveldb阅读知识点积累
- <<离散数学>>n个元素,m个组合,可重复