今天突然看到一个题,是有关于 i++、++i,对于他们的结果一直以来只是记住口诀,并不知道原理,使用起来也不那么顺畅。
i++:先取值,后计算
++i:先计算,后取值
若当题目仅仅是 i = i++;
时,自己能迅速求出结果,但要是题目是 i = i + ++i + i++;
的时候就有点头疼了,还很可能会搞错。
到底++
计算过程是怎么样的呢,我于是就好奇了,到底他们是怎么实现的呢,今天就将它们的原理说一下。
图解i++和++i,从底层搞懂它们的原理
几个相关的考题
起因是突然看到了这几道题目,一瞬间自己居然不知道正确结果是什么,而且还要考虑很久,这一看就是 知其然,不知其所以然 的表现。
题目如下:
//第一题:
int i = 0;
i++;
System.out.println(i);
//第二题:
int j = 0;
j = j++;
System.out.println(j);
//第三题:
int n = 0;
++n;
System.out.println(n);
//n = ++n 和 n++ 的结果一样吗?
//最终考题:
int a = 1;
a = a++;
int b = a++;
int c = a + ++a * a++;
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
你们知道这些题的答案吗,也会像我一样犹豫吗?没事,下面的文中我会告诉你它们的运算原理是什么,往下看。
i ++
首先公布第一题和第二题的答案。
//第一题:
int i = 0;
i++;
System.out.println(i);// 1
//第二题:
int j = 0;
j = j++;
System.out.println(j); // 0
这是为什么呢?都是i++
,怎么结果却不一样。不多说,直接贴出反编译的源码,根据运行过程一步步来分析。源码先用javac xx.java
进行编译,然后使用javap -v xxx.class
可以反编译得到。
首先看看第一题反编译后的源码:
public static void main<