前言
虚怀若谷,大智若愚。温故而知新,本文介绍Java基础中的i++相关知识。提示:以下是本篇文章正文内容,下面案例可供参考
一、++是什么?
++是算术运算符中的一种,++运算包含前置运算和后置运算两种变化,前置运算需要把运算符放置在操作数前,规则是先运算,再使用操作数变量值,就是我们常说的++i。后置原酸需要把运算符放置在操作数后,规则是先使用操作数变量值,再进行自增,也就是我们常说的i++
二、用法
1.简单题目分析
public static void main(String[] args){
int i = 0;
System.out.println(i++);
System.out.println(++i);
}
相信大家可以很快说出两次输出的结果分别为0,2。
执行完以;号结尾的语句System.out.println(i++);后再进行+1,所以第一次输出时i仍然为0,当执行第二句输出时i的值已经为1,此时++1为先进行+1,再执行;号结尾的语句System.out.println(++i);,所以第二次输出为2。
这种思路理论上好像可行,但很遗憾地说,这种理解是错的。原因很简单,我们把第二句输出System.out.println(++i);去掉再执行上述代码块就很容易证实。
2.复杂题目分析
public static void main(String[] args) {
int i = 1;
i = i ++;
int j = i ++;
int k = i ++ + i * i ++;
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
带着前面一题调整后的输出结果,我们再看看这道题,应该要花几分钟才能在草稿纸上算完。不出意外的话,大家会发现最后算出的结果跟正确答案相去甚远。
经过这两道题目,我们已经对i++的用法产生了怀疑,其实书本上的定义说的并没有错,只是我们没有深入了解,所以并不能正确理解,接下来我们一起再用另一种方式理解。
2.用法原理分析
其实对于++,我们需要结合Java内存才能准确无误的理解其用法。首先,我们先引入两个概念:操作数栈和局部变量表。操作数栈用来存放操作数i,局部变量表用来声明和存放变量i、j、k,i++的运算过程是先将操作数i压栈,然后再让局部变量表中i的值进行自增,最后再将操作数i弹栈,赋值给局部变量表。++i的运算过程是先让局部变量表中i的值进行自增,其次再将操作数i压栈,等赋值类运算符=右边的运算结束后,再将操作数弹栈赋值给局部变量表。
当我们消化完这个概念后,下面让我们结合代码逐步分析:
int i = 1;
在局部变量表中声明i变量,并初始化值为1
i = i ++;
首先将操作数i=1压栈,其次赋值运算符右边局部变量表i自增变为2,接着赋值运算符右边运算结束,操作数栈弹栈i=1赋值给局部变量表i,注意,此时i仍为1
int j = i ++;
首先局部变量表标识j变量,其次操作数i=1压栈,接着赋值运算符右边局部变量表i自增变为2,最后操作数栈弹栈i=1赋值给局部变量表j,此时j为1,i为2
int k = i ++ + i * i ++;
首先局部变量表标识k变量,其次a.操作数i=2压栈,接着赋值运算符右边局部变量表i自增变为3,右边运算中i ++部分结束,紧接着b.计算i * i++。注意,此时还未运算完,但局部变量表中i的值已经为3。当i * i ++ = 3 * 3 = 9计算完后,局部变量表i再次自增,此时i=4。然后c.右边运算表达式结果2 + 3 * 3 = 11压栈,赋值类运算符=右边运算全部结束,最后d.操作数栈弹栈赋值给局部变量表k,e.后续再无算术运算,操作数栈弹栈赋值i=4,此时为k为11,i为4
最后输出结果分别为:4,1,11