博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[改善Java代码]警惕自增的陷阱
阅读量:6250 次
发布时间:2019-06-22

本文共 1271 字,大约阅读时间需要 4 分钟。

建议7: 警惕自增的陷阱

老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了:

1 public class Client {  2     public static void main(String[] args) {  3           int count =0;  4           for(int i=0;i<10;i++){  5            count=count++;  6           }  7           System.out.println("count="+count);  8    }  9 }

这个程序输出的count等于几?是count自加10次吗?答案等于10?可以非常肯定地告诉你,答案错误!运行结果是count等于0。为什么呢?

count++是一个表达式,是有返回值的,它的返回值就是count自加前的值,Java对自加是这样处理的:首先把count的值(注意是值,不是引用)拷贝到一个临时变量区,然后对count变量加1,最后返回临时变量区的值。程序第一次循环时的详细处理步骤如下:

步骤1 JVM把count值(其值是0)拷贝到临时变量区。

步骤2 count值加1,这时候count的值是1。

步骤3 返回临时变量区的值,注意这个值是0,没修改过。

步骤4 返回值赋值给count,此时count值被重置成0。

 

count=count++”这条语句可以按照如下代码来理解:  

1 public static int mockAdd(int count){  2     //先保存初始值  3     int temp =count;  4     //做自增操作  5     count = count+1;  6     //返回原始值  7     return temp;  8 }

于是第一次循环后count的值还是0,其他9次的循环也是一样的,最终你会发现count的值始终没有改变,仍然保持着最初的状态。

此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。解决方法很简单,只要把“count=count++”修改为“count++”即可。

该问题在不同的语言环境有不同的实现: C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。每种语言对自增的实现方式各不同,读者有兴趣可以多找几种语言测试一下,思考一下原理。

下次如果看到某人T恤上印着“i=i++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。

 

转载于:https://www.cnblogs.com/DreamDrive/p/5412648.html

你可能感兴趣的文章
[BZOJ 2140]稳定婚姻(强连通分量)
查看>>
人工智能工程师学习路线
查看>>
Nginx入门(2)反向代理和负载均衡
查看>>
MySQL库表状态查询
查看>>
【鲁班学院】干货分享!《面试必备之Mysql索引底层原理分析》
查看>>
第十一周项目0-是春哥啊
查看>>
poi做一个简单的EXCAL
查看>>
几种查询emacs帮助的办法
查看>>
Python_基础_(模块,time,random,os,sys,json,shelve,xml,序列化反序列化)
查看>>
异常:Project configuration is not up-to-date with pom.xml解决方案
查看>>
HDU2647 拓扑排序
查看>>
ThinkPHP/---微信支付PC流程
查看>>
JavaScript 05
查看>>
python 多线程编程之threading模块(Thread类)创建线程的三种方法
查看>>
实验三
查看>>
水仙花数
查看>>
P3308 [SDOI2014]LIS(最小割+退流)
查看>>
C语言作业--数据类型
查看>>
压位高精
查看>>
jsp 中对jar 包的引用
查看>>