Java解惑2-25无情的增量操作
来源:互联网 发布:javascript实战 编辑:程序博客网 时间:2024/05/22 00:13
下面的程序对一个变量重复地进行增量操作,然后打印它的值。那么这个值是什么呢? 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中的教训相同:不要在单个的表达式中对相同的变量赋值超过一次。对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行为。
- Java解惑2-25无情的增量操作
- 《Java解惑》系列——03循环谜题——谜题25:无情的增量操作(表达式中变量赋值不要超过一次)
- java类似增量指针的操作
- java解惑之移位操作
- 无情的雨无情的你
- Java解惑2-11最后的笑声
- 《C语言解惑》之 谜题1.3 逻辑操作符和增量操作符
- java解惑 - 半斤八两(2)
- Java 解惑2
- Java解惑2
- 火,是无情的
- 无情的日子
- 无情的你
- java 同步操作降低效率解惑
- 无情的事实--人类曾经被彻底毁灭过(2)
- java解惑 - 最后的笑声
- java解惑--灰色的影子
- 【java解惑】无处不在的bug
- 转载: 吾为吾师:劝诫“80后”书
- OK6410 烧写LINUX系统的问题与解决
- Java解惑3-24尽情享受每一个字节
- 苹果绿设置
- 掌握你的心灵的力量 - 一种快速假定性综述
- Java解惑2-25无情的增量操作
- 解析浮点数内存
- C#正则表达式小结
- WCF六个步骤
- c#正则表达式快速入门提升教程
- symbian 全屏的方法
- 对于 Package gstreamer-0.10.23 was not found in the pkg-config search path. 的问题的解决
- 关于索要ExtJs例子中源代码的声明
- C语言实现ICMP协议Ping命令