基础理解
一般都知道的是
i++ 的时候 i 是后加的
++i 的时候 i 是先加的
那么来具体理解一下
i++ :先引用后增加
++i :先增加后引用
这是什么意思呢
即
i++ :先在i所在的表达式中使用i的当前值,后让i加1
++i :让i先加1,然后在i所在的表达式中使用i的新值
可能还不是很明白,那么就来个demo把
在 int i4 = i3++;这个表达式中,先执行 i4 = i3,把i3的值赋给i4,之后i3才会进行+1操作。
在 int i6 = ++i5;这个表达式中,先执行 i5+1操作,之后在进行把i5的值赋给i6的操作。
这样是不是就明白了
那么来进一步搞事情把
int i7 = 10;
i7 = i7++;
int i8 = 10;
i8 = ++i8;
猜猜这两个结果是啥,可能你会猜11和11,因为就是被+1了嘛
不过既然这么问了,这里面肯定一不小心就进坑了,遇到不清楚的问题,先回顾一遍概念
i7++是先引用后++
++i8是先++后引用
真要刚起来就直接看反编译的代码把
int i7 = 10;
int var14 = i7 + 1;
System.out.println(i7);
int i8 = 10;
int i8 = i8 + 1;
System.out.println(i8);
一目了然
其实有个简便理解的方法
i7++可以看成是一个整体,i7++整体=i7之前的值,即i7=10那么i7++也=10
++i8也可以看成是一个整体,++i8整体=i8+1之后的值,即i8=10那么++i8=11
再来个容易错误的demo
int i9 = 10;
int i10 = i9++ + ++i9;
System.out.println(i10);
按照一般思路去解题,这里肯定以为是21,因为大家都是按照人的思路从左往右计算的嘛,但是计算机可不这么想.
首先,我们需要了解一个知识点。大家都听说过java程序要想运行起来,必须得在特定的java环境中。那么,这个环境中就由一个叫JVM的虚拟机来进行java程序的一切操作和管理。
在jvm中,虚拟机栈会对方法中的变量和操作进行处理。在虚拟机栈中,有一个局部变量表和操作数栈,他们两个相互配合,完成一个方法的变量赋值,四则运算!
结论:在进行表达式运算时,都是自右向左依次压入栈中
因此,此处的 int i10 = i9++ + ++i9; 相当于先进行 ++i9,在进行 i10 = i9++的操作。
所以,此处的表达式就相当于
i9 = i9 + 1;
i10 = i9+i9;
i9 = i9 + 1;