一篇文章彻底弄懂 i++和++i
Java中i++和++i 想必大家都不陌生,但大多数同学对此可能都只是处于基础了解
@Test
public void calculate(){
int i = 0;
int m = i++;
System.out.println(m);//输出0
int a = 0;
int b = ++a;
System.out.println(b);//输出1
}
}
绝大多数的同学对于二者的认知可能仅限于以上两个小计算
并且牢记住那个口诀,i++先赋值在运算 ++i 先运算在赋值
口诀固然无错,但是只有真正知晓背后的原理才能正确的使用
@Test
//案例一
public void cal(){
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
假如碰到以上的案例,到底应该输出几?我想这时候单纯的背诵口诀已经很难解决后续的问题了,所以我们变从它的字节码文件来看待问题
i++:
0: iconst_0 // 生成整数0 1: istore_1 // 将整数0赋值给1号存储单元(即变量i) 2: iload_1 // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0) 3: iinc 1, 1 // 1号存储单元的值+1(此时 i=1) 6: istore_2 // 将数据栈顶的值(0)取出来赋值给2号存储单元(即变量m,此时i=1,m=0) 7: return // 返回时:i=1,m=0++i:
0: iconst_0 // 生成整数0 1: istore_1 // 将整数0赋值给1号存储单元(即变量a) 2: iinc 1, 1 // 1号存储单元的值+1(此时 a=1) 5: iload_1 // 将1号存储单元的值加载到数据栈(此时 a=1,栈顶值为1) 6: istore_2 // 将数据栈顶的值(1)取出来赋值给2号存储单元(即变量j,此时a=1,b=1) 7: return // 返回时:a=1,b=1
所以此时,我们再看一个案例,一步步的解析
int i = 0;
i = i++;
//大部分同学可能已经得出了正确答案,此时 i = 0;
/*
* 首先开辟空间i=0
* 将放到栈中
* 开始进行加法操作i=1
* 将数据栈中的值再次赋值给i 此时i = 0;
* */
所以案例一的答案已经呼之欲出了
int i = 1; i = i++;//i=1 int j = i++;//j=1 i = 2; int k = i+ ++i * i++;//k= 2+ 3*3 //最后一步的i++在乘法运算时为3,但在运算结束后要进行赋值操作
总结:面对仍旧不理解的同学可以记住一点
i++在等号右边进行赋值操作时候,左边所得之数和i++未运算前一致
i++和++i的唯一区别即是i++为自加操作,自加操作不用在数据栈中进行
本文详细探讨了Java编程中i++和++i的区别,不仅介绍它们的基础用法,还通过字节码文件解析了它们的运算原理。强调了在等号右边使用i++时,左边得到的值与运算前相同,而++i则是先运算再赋值。通过实例解析,帮助读者深入理解这两个操作符的差异。
4954

被折叠的 条评论
为什么被折叠?



