接着上一篇文章,发现关于i++和++i确实有必要深入了解。
实际上++i比较容易理解,就是把原值加1,再用于运算中,但i++却是先进行运算,再进行递增加1,在多个组合式是,到底什么是对i++进行自增加1的运算却是一个较复杂的问题。
另一道题
class Test{
public static void main(String[] args){
int i = 0,j=0;
i = ++i + i++ + i++ + i++;//式1
j = j++ + j++ + j++ + ++j;//式2
System.out.print(“i=”+i);
System.out.print(“,j=”+j);
}
}
答案 : i=7 ,j=7
式1的运算过程:
第一步,第一个++i计算后i=1,++i计算的结果为1
第二步,然后就是i++的计算后i的值不变仍为1,i++的计算结果为1;
第三步,接着计算前一步骤中i++自增后的值,此时i=2,再就是第二i++的计算,i的值不变仍是2,所以这一步中i++的计算结果为2;
第四步,同上一步计算前一步骤中i++自增后的值,此时i=3,所以这一步中i++的结果是3
第五步,最终结果是1+1+2+3=7;
式2的运算过程:
第一步,j++计算后的结果为0 ;j进行自增运算后j=1;(先将j的值存入堆栈,然后对变量区中的j自加1,此时变量区中j=1)
第二步,第二个j++的运算结果为1,但是j = 2;(将变量区的j的值存入堆栈,然后对变量区中的j自加1,此时变量区中的j=2)
第三步,第三个j++的运算结果为2,但j = 3;(将变量区的j的值存入堆栈,然后对变量区中的j自加1,此时变量区中的j=3)
第四步:++j运算结果为4,j=4;(对变量区中的j自加1,然后再将变量区中j的值存入堆栈,此时变量区中的j=4)
第五步,最终结果是0+1+2+4=7;
式的运算过程是按照变量区的值和堆栈中的值的变化来写,总结起来i++就是先将变量区中的值存入堆栈中,再对变量区进行自加1,
而++i则是先变量区的值进行自加1操作后,再将变量区中的值放入堆栈中。堆栈中保存的是临时值,在运算式中用到的值都是变量区中的值。