关于Java中的自增、自减运算符j=j++;

期待可为 期待可为 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这几天要准备找实习了,临阵磨枪,不快也光,然后开始疯狂做题突击,遇到了这么一题

import java.util.*;
public class Test{
public static void main(String[] args){
int j=0;
for (int i = 0; i < 100; i++){
j = j++;
}
System.out.println(j);
}
}

问输出的结果是多少。我相信很多人和我一样第一反应应该是想到100。但是结果却是错误的,不敢相信,然后上机实践发现确实不对。这是为什么?结果又应该是多少呢?
原来这是因为Java编译器使用了中间缓存变量的机制。j=j++;可以转换为如下写法:

temp = j;
j = j + 1;
j = temp;

这是在Java程序员面试宝典中给出的答案,感觉很不理解,然后又上网开始查,发现http://www.bitscn.com/plus/view.php?aid=20350这个解释就很容易理解了。
像j=j++;这种赋值语句, Java编译器每次遇到自增、自减运算符的时候都会开辟一块新的内存空间来保存赋值之前j的值,就是前文介绍的缓存变量,然后再将这个换成变量的值赋给左边的变量。链接里面通过内存空间图的方式讲解的很清楚,这里就不重复了。
所以本题的正确结果应该就是0。
题目会做错从本质上来分析的话应该还是对自增、自减运算符没掌握好,究竟是先用原值进行计算再加1,还是先加1再进行运算是这类题目特别需要注意的陷阱。这题是先用j的原值进行计算,那就是j=0;之后应该还有一个自增语句,但是由于变量已经被覆盖了,貌似就可以忽略了。
如果我们将赋值语句改为j = ++j;那会怎么样呢?现在应该是这么个流程

temp = j +1;
j = j + 1;
j = temp;

如果是这样的话,输出应该就是100了。
所以再对自增、自减运算符的变量进行赋值时都需要特别注意。借用别人的一句话:“如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。”
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
期待可为
非技术区 23,404 成员 70,506 内容