知识点:
在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中的教训相同:不要在单个的表达式中对相同的变量赋值超过一次。 对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行 为。 |