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

知识点:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值