今天看到一个题,问下面代码输出来是答案是多少:

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);}
}

结果居然是0;

懵逼了,后来查资料才搞懂是为什么。原来这是因为Java编译器使用了中间缓存变量的机制。j=j++;可以转换为如下写法:

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

像j=j++;这种赋值语句, Java编译器每次遇到自增、自减运算符的时候都会开辟一块新的内存空间来保存赋值之前j的值,就是前文介绍的缓存变量,然后再将这个换成变量的值赋给左边的变量。

详细点说,在这里JVM里面有两个存储区,一个是暂存区(以下称为堆栈),另一个是变量区。j=j++是先将j的值(0,原始值)存入堆栈中(对应图中分配一块新的内存空间),然后对变量区中j自加1,这时j的值确实是1,但随后将堆栈中的值赋给变量区的j,所以最后j=0;

我们再来看看 j=++j

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

j=++j,是先对变量区中的j加1,再将变量区中的j值1存入堆栈,最后将堆栈中的值赋给自变量区的j,所以j=1;

j = j ++ 和 j = ++ j的区别相关推荐

  1. iptables中-j选项与-g选项的区别

    手册 # man iptables ... -j, --jump target This specifies the target of the rule; i.e., what to do if t ...

  2. Check failed: top_shape[j] == bottom[i]-shape(j) (1 vs. 2) All inputs must have the same shape, exc

    在运行ShuffleNet的过程中碰到了如下报错 : I1018 19:26:19.104892 3548 net.cpp:84] Creating Layer resx13_concat I1018 ...

  3. SWPU-DS)若有 n 阶对称矩阵 A,以行序为主序方式,将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在 B 中确定 a[i, j](i<j)

    SWPU-DS)若有 n 阶对称矩阵 A,以行序为主序方式,将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1-(n(n+1))/2]中,则在 B 中确定 a[i, j](i< ...

  4. 在matlab中chrom,一段matlab程序,其中chrom(i,j)=p(chrom(i,j),j)是什么意思

    一段matlab程序,其中chrom(i,j)=p(chrom(i,j),j)是什么意思0 function[eval]=targetalloc(chrom) [m,n]=size(chrom); p ...

  5. pytorch 代码:yield features.index_select(0,j), labels.index_select(0,j)

    pytorch 代码:yield features.index_select(0,j), labels.index_select(0,j) yield features.index_select(0, ...

  6. for(j=0,i=0;j6,i10;j++,i++) { k=i+j; } k 值结果是多少?

    <script type="text/javascript">function Test(){var k=0;for(j=0,i=0;j<6,i<10;j+ ...

  7. 2018 CCPC桂林H,J 2019ICPC 台北H J

    这场nice,一个签到,三个铜牌题做出,铜牌题做两个就有铜了. 但是除了读题基本0贡献了,签到的活被抢了,G完全没参与,H想好思路之后居然写挂了. J(博弈) 之前做过一个题是确定最终状态,由于真的长 ...

  8. i += j ;与 i = i + j ; 的区别

    首先要知道 i += j; 等于 i = (T) (i + j); 这个 T 是 i 的类型,而 i = i + j; 是同类型的. 举个例子:int  x =  5; x += 5.6; //这个语 ...

  9. c语言(p i),【C语言】*(p+i) [j] 和 (*(p+i))[j] 的区别问题。万分感谢!!

    满意答案 fhxzz 2013.09.10 采纳率:49%    等级:12 已帮助:7395人 *(p+i) [j]分两步 1.tmp = (p+i)[j 2.return *tmp (*(p+i) ...

  10. iptables的nat表中 -j redirect 与-dnat --to-destnation的区别

    redirect是针对本机的,本机产生的包转到localhost的某个端口,适合用redirect,会比DNAT效率高点. 而外部地址只能用DNAT了.

最新文章

  1. 这 3 个字是未来发展关键,不重视的企业,正在被淘汰
  2. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)
  3. <马哲>劳动价值论的理论及实践意义
  4. [2016-03-15]rabbitmq notes
  5. 如何初始化一个vue项目
  6. 线性代数:矩阵学习笔记
  7. SQL server 使用自定义函数以及游标
  8. 求助,我在Kell官网上下载的固件库,双击运行后显示错误:Zip integrity check failed.,该怎么解决?
  9. 【数据结构与算法C语言版】基础代码整理 思维导图
  10. nc 二次开发_金蝶云星空(K3CLOUD)和用友NC对比
  11. Linux系统基本操作及命令详解
  12. SAML 协议-简单的SAML
  13. Java 日志框架详解
  14. [论文阅读笔记17]A Survey on Knowledge Graph-Based Recommender Systems
  15. 17.python-解决 pycharm运行提示:from PyQt5 impor ImportError:DLL load failed while importing QtCore
  16. 了解自动驾驶 从ADAS开始
  17. oracle监听程序的配置
  18. 第一类公民(First-class Citizen)
  19. 三翼鸟:定义“新居住”
  20. 鸿蒙系统什么手机可以,鸿蒙系统的手机,会有哪些不一样的体验?

热门文章

  1. curl 调试工具 curl_getinfo
  2. 三星530换固态硬盘_满血PCIe 4.0:三星980PRO固态硬盘评测
  3. 开机启动时右下角的小喇叭不见了
  4. expandablelist
  5. 计算机在线作业三答案,电科19秋《计算机操作系统》在线作业3【满分答案】
  6. 此文件是二进制文件或使用了不支持的文本编码_计算机的基本原理(组成、发展、DOS、交互、文件、进制、环境)...
  7. 实现企业的降本增效,设备管理应该怎么做?
  8. 川崎机器人signal_川崎机器人常用指令表
  9. CSS3中(border-radius)边框圆角详解
  10. iOS每日一记之———————————————终级完美大整理