警惕自增的陷阱
来源:互联网 发布:淘宝首页添加热点 编辑:程序博客网 时间:2024/05/01 13:04
<span style="font-size:18px;"> public class Client { public static void main(String[] args) { int count =0; for(int i=0;i<10;i++){ countcount=count++; } System.out.println("count="+count); } } </span>
这个程序输出的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。
<span style="font-size:18px;"> “countcount=count++”这条语句可以按照如下代码来理解: public static int mockAdd(int count){ //先保存初始值 int temp =count; //做自增操作 countcount = count+1; //返回原始值 return temp; } </span>
于是第一次循环后count的值还是0,其他9次的循环也是一样的,最终你会发现count的值始终没有改变,仍然保持着最初的状态。
此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。解决方法很简单,只要把“count=count++”修改为“count++”即可。该问题在不同的语言环境有不同的实现: C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。每种语言对自增的实现方式各不同,读者有兴趣可以多找几种语言测试一下,思考一下原理。
下次如果看到某人T恤上印着“i=i++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。
0 0
- 警惕自增的陷阱
- 警惕自增的陷阱
- java警惕自增的陷阱
- 警惕加减交换的陷阱
- Java的自增陷阱
- 变量自增的陷阱
- 警惕CRM范围渐变的陷阱
- 警惕!电脑销售人员的陷阱
- 警惕程序优化的七大陷阱
- 警惕购买空间的六大陷阱
- 警惕免费域名背后的陷阱
- 警惕SOA陷阱
- 警惕转基因陷阱
- 警惕:信用卡分期陷阱
- 警惕JavaScript的对象属性无法自动求值的陷阱
- Java 自增陷阱
- JAVA自增陷阱
- 警惕SaaS服务的应用风险和价格陷阱
- LeetCode Plus One
- 测试人员绩效评价方法
- excel 统计字符出现的次数
- python unix 时间戳
- HDU 4771 Stealing Harry Potter's Precious (BFS)2013杭州现场赛
- 警惕自增的陷阱
- 17.1.1.8 Setting Up Replication with Existing Data
- 合成一个新的dateframe
- iOS开发:绘制像素到屏幕
- SQL Server 复制:事务发布
- 【IOS 开发学习总结-OC-43】★ios开发——UIButton(按钮)与 UISwitch(开关按钮)
- Javascript获取属性的值以及比较值
- hdoj Conturbatio 5480 (数组模拟+技巧) 好题
- npm 安装 appium 更换源的方式安装