A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王海彬 中级黑马   /  2015-9-17 23:24  /  244 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的程序对一个变量重复地进行增量操作,然后打印它的值。那么这个值是什
么呢?
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。
当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfixincrement 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 了。不要在单个的表达式中对相同的变量赋值超过一次。
对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行为。


2 个回复

倒序浏览
学到了..
回复 使用道具 举报

感谢支持,希望能让大家学习更愉快
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马