zoukankan      html  css  js  c++  java
  • 警惕自增的陷阱

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

    这个程序输出的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。

    1. countcount=count++”这条语句可以按照如下代码来理解:  
    2. public static int mockAdd(int count){  
    3.      //先保存初始值  
    4.      int temp =count;  
    5.      //做自增操作  
    6.      countcount = count+1;  
    7.      //返回原始值  
    8.      return temp;  

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

    此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。解决方法很简单,只要把“count=count++”修改为“count++”即可。该问题在不同的语言环境有不同的实现: C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。每种语言对自增的实现方式各不同,读者有兴趣可以多找几种语言测试一下,思考一下原理。

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

  • 相关阅读:
    less的使用
    04 LeetCode --- 反转整数
    03 LeetCode --- 反转整数
    数据结构--- 队列
    数据结构---栈
    数据结构---列表与数组
    04-配置阿里云yum源并启动nginx服务
    03-linux命令
    02-windows下vmware配置nat网络
    01-xshell连接linux
  • 原文地址:https://www.cnblogs.com/pbq-dream/p/5289501.html
Copyright © 2011-2022 走看看