《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解惑》系列——03循环谜题——谜题26:在循环(注意栅栏柱问题、数字的溢出)
- 《Java解惑》系列——03循环谜题——谜题24:尽情享受每一个字节(避免混合类型比较)
- 循环谜题25:增量操作
- 《Java解惑》系列——01表达式之谜——谜题09:半斤
- python变量命名、赋值、增量赋值操作实例
- (原创)c#学习笔记03--变量和表达式03--变量04--变量的声明和赋值
- Java解惑2-25无情的增量操作
- 《Java解惑》系列——02字符谜题——谜题11:最后的笑声(字符、字符串连接操作)
- 【Objective-C】03-OC对象struct类型成员变量的赋值
- java解惑之表达式之谜(谜题7)
- 委托、Lambda表达式、事件系列03,从委托到Lamda表达式
- 不要在foreach 循环里进行集合元素的 remove/add 操作
- python语句、表达式、对象、变量、赋值、函数传参
- Java8 实战系列-03-lambda 表达式实战
- 在django template中定义临时变量,并自定义操作:赋值、自增
- C语言基础:进制转换,变量,常量,表达式,基本数据类型,输出函数,输入函数,运算符. 分类: iOS学习 c语言基础 2015-06-10 21:39 25人阅读 评论(0) 收藏
- (原创)c#学习笔记03--变量和表达式04--表达式01--数学运算符
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- Python基础0:变量 赋值 表达式和运算符
- Java循环变量在哪里赋值