移动开发进阶Android知识程序员

【每日一文】一段有趣的Java代码

2016-11-24  本文已影响546人  Jboob
图片与内容无关

呵呵, count 等于几?

public static void main(String args[]){ 
   int count = 0;    
   for (int i = 0; i < 10; i++){       
        count = count ++;    
   }    
    System.out.print("count:"+count);
}

这段程序说出的是多少呢?
是不是 count 自加10 ,答案等等于10吗?
可是我可以非常肯定的告诉你,答案错误!运行结果是count 等于 0。
** why? **

count ++ 是一个表达式,是有返回值的,它的返回值就是 count 自加前的值,Java 对自加是这样处理的:首先把 count 的值(注意是值,不是引用)拷贝到一个临时变量区,然后对 count 变量加 1,最后返回临时变量区的值。程序第一次循环时的详细步骤如下:
** 步骤1** JVM 把 count 值(其值是0)拷贝到临时变量区。
步骤2 count 值加 1,这时候 count 的值 是 1。
** 步骤3** 返回临时变量区的值,注意这个值是 0 ,没修改过。
步骤4 返回值赋值给 count,此时 count 值被重置成 0。
“count = count ++” 这条语句可以按照如下代码来理解:

  public static int add(int count){
        //先保存初始值
        int temp = count;
        //做自增操作
        count = count + 1;
        //返回原始值
        return temp;
    }

于是第一次循环后 count 的值还是 0 ;其他 9 次的循环也是一样的,最终你会发现 count 的值始终没有改变,仍然保持着最初的状态。
此例中代码的作者的本意是希望 count 自增,所以想当然低认为赋值给自身就成了,不曾想掉到 Java 自增的陷阱中了。解决方法很简单,只要把 “count = count ++” 修改为 “count ++”即可。该问题在不同的语言环境有不同的实现: C++ 中 “count = count ++” 与 “count ++” 是等效的,而在 php 中则保持着与 Java 相同的处理方式。每种语言对自增的实现方式各不同,读者感兴趣可以找几种语言测试一下,思考下原理。
正确的代码贡献于此:

public static void main(String args[]){    
      int count = 0;   
      for (int i = 0; i < 10; i++){       
           count ++;    
       }    
       System.out.print("count:"+count);
 }

哈哈,下次如过你在某大街上看到某人的T恤上印着 i = i++,千万别小看他,说不定就是大神。说到这里了,呵呵,还不赶紧去装个逼!!!

总结:
基础很重要,任何时候不要觉得自己很牛逼,时刻告诫自己需要学习的还有很多,在你感觉自己很满足的时候请你回头看看你曾经丢下的看不起的基础知识,看看你是否能真正的理解呢!

本文思路来自读:《编写高质量代码之Java》所感所悟,写此时刻警醒自己,学习永无止境!!!

上一篇下一篇

猜你喜欢

热点阅读