您的位置:首页 > 编程语言 > Java开发

《Java解惑》系列——03循环谜题——谜题25:无情的增量操作(表达式中变量赋值不要超过一次)

2014-05-07 14:37 405 查看

知识点:

在Java表达式中,避免这种情况发生:在一个表达式中,对一个变量的赋值超过一次。这样极易导致误解和错误。

问题:

下面的程序会打印什么?

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
// 实际结果:打印0


结果出乎意料,的确如此。产生这样结果的原因:

反正我没有理解~~~~(>_<)~~~~

乍一看,这个程序可能会打印100。毕竟,它对j做了 100次增量操作。可能会

令你感到有些震惊,它打印的不是 100 而是 0。所有的增量操作都无影无踪了,

为什么?  

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

j = j++;

大概该语句的作者是想让它执行对j的值加 1 的操作,也就是表达式j++所做的

操作。遗憾的是,作者大咧咧地将这个表达式的值有赋回给了j。  

当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfix

increment operator)[JLS 15.14.2]:表达式j++的值等于j在执行增量操作

之前的初始值。因此,前面提到的赋值语句首先保存j的值,然后将j设置为其

值加 1,最后将j复位到它的初始值。换句话说,这个赋值操作等价于下面的语

句序列:  //为什么是这个样子的,我是没有看懂,java基础知识呀( ⊙ o ⊙ )

int tmp = j;

j = j + 1;

j = tmp?;

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

解决方案:

改写引起错误和误解的地方。



j++

替换

j = j++

总结:

这与谜题7中的教训相同:不要在单个的表达式中对相同的变量赋值超过一次。

对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行

为。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java java解惑
相关文章推荐