Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1942290
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Java

2007-03-05 18:39:55

下面的程序对一个变量重复地进行增量操作,然后打印它的值。那么这个值是什么呢?

public class Increment {

    public static void main(String[] args) {

        int j = 0;

        for (int i = 0; i < 100; i++)

              j = j++;

        System.out.println(j);

    }

}

乍一看,这个程序可能会打印100。毕竟,它对j做了100次增量操作。可能会令你感到有些震惊,它打印的不是100而是0。所有的增量操作都无影无踪了,为什么?

就像本谜题的题目所暗示的,问题出在了执行增量操作的语句上:

j = j++;

大概该语句的作者是想让它执行对j的值加1的操作,也就是表达式j++所做的操作。遗憾的是,作者大咧咧地将这个表达式的值有赋回给了j

++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfix increment operator[JLS 15.14.2]:表达式j++的值等于j在执行增量操作之前的初始值。因此,前面提到的赋值语句首先保存j的值,然后将j设置为其值加1,最后将j复位到它的初始值。换句话说,这个赋值操作等价于下面的语句序列:

int tmp = j;

j = j + 1;

j = tmp?;

程序重复该过程100次,之后j的值还是等于它在循环开始之前的值,即0

订正该程序非常简单,只需从循环中移除无关的赋值操作,只留下:

for (int i = 0; i < 100; i++)

      j++;

经过这样的修改,程序就可以打印出我们所期望的100了。

这与谜题7中的教训相同:不要在单个的表达式中对相同的变量赋值超过一次。对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行为。
阅读(1202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~