警惕自增的陷阱

简介:

老师就说:自增有两种形式,分别是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++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。

 



本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5412648.html,如需转载请自行联系原作者
相关文章
|
4月前
|
安全 程序员 开发者
【程序员必看】汇编语言中的致命陷阱:如何避免那些让人夜不能寐的安全隐患?
【8月更文挑战第31天】编写安全的代码是每个程序员的目标,尤其在使用汇编语言时更为重要。本文探讨了汇编语言编程中常见的错误类型及预防措施。首先介绍了汇编语言的特点,然后详细分析了四种常见错误:越界内存访问、不当的数据类型转换、不正确的堆栈操作以及不安全的输入处理。每种错误均附有示例代码和具体预防措施,帮助开发者避免这些陷阱,提高代码安全性。通过遵循这些指导原则,可以显著降低错误发生率,确保程序的安全性和可靠性。
79 0
|
7月前
|
设计模式 存储 算法
谈谈代码:如何避免写出糟糕if...else语句
在写代码的日常中,`if...else`语句是极为常见的.正因其常见性,很多同学在写代码的时候并不会去思考其在目前代码中的用法是否妥当.而随着项目的日渐发展,糟糕的`if...else`语句将会充斥在各处,让项目的可维护性急剧下降.故在这篇文章中,笔者想和大家谈谈如何避免写出糟糕`if...else`语句.
50 0
谈谈代码:如何避免写出糟糕if...else语句
|
7月前
|
自然语言处理 编译器 程序员
C陷阱与缺陷:词法陷阱
C陷阱与缺陷:词法陷阱
55 0
|
编译器 C语言
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
《C陷阱与缺陷》之“语义”陷阱——数组越界导致的程序死循环问题
149 0
掉入陷阱的数字
掉入陷阱的数字
92 0
|
自然语言处理 编译器 程序员
《C陷阱与缺陷》----词法“陷阱”
由于在C语言中赋值操作相对于比较出现更加频繁,所以将字符较少的符号=赋予更常用的含义—赋值操作。
110 0
|
存储 Java
一个极易被忽略的内存泄漏情况,看看你会不会犯一样的错
Java之所以能够成为世界上最受欢迎的语言,与其垃圾回收机制分不开。我们Javaer能够在创建完对象后就不用管她的生死,确实是十分方便(真特么是个渣男)。可是有时候因为你创建了她,又对她爱答不理,就很有可能出大问题。
|
缓存 小程序 Java
IntegerCache的妙用和陷阱!
考虑下面的小程序,你认为会输出为什么结果?
127 0
IntegerCache的妙用和陷阱!
|
SQL 关系型数据库 MySQL
谈谈Mysql索引优化不得不提防的坑
前言   在之前的文章《聊聊Mysql优化之索引优化》中,笔者简单介绍了Mysql索引优化的原理和一些使用场景,然而Mysql索引优化的内容还远远不止这些。
1955 0