关于前置++与后置++的差别,这似乎再熟悉不过了。前置++ 是先将变量的值加1,然后使用加1后的值参与运算。而后置++ 是先使用该值参与运算,然后再将该值加1。

没错,关于二者之间的区别,的确可以这么认为,并且按照上面的方法操作,运算中也基本不会有什么错误。但是如果我告诉你,后置++ 其实与前置++一样,在参与运算之前都会将变量加1,你会信吗?

哈哈,鬼才信呢,那我告诉你这是真的.....

   {
       ([] ) {
           ;
        ();
        ();
        ();
        ();
    }

       ( ) {
           ;
        ..(      );
    }

       ( ) {
          ;
        ..(  );
    }

       ( ) {
           ;
        ..(      );
    }

       ( ) {
          ;
        ..(  );
    }
}

程序并不复杂,就是使用前置++和后置++。运行结果如下:

prePlus1:i=16,j=16
prePlus2:i=16
prePlus3:i=16,j=15
prePlus4:i=15

前三个方法输出没什么,属于正常,也是大家所能接受的。那么第四个方法怎么就输出 i=15呢?

为什么会是15呢?按照通俗的见解,虽然后置++是先参与运算,然后再将值加1,但是执行对自身的赋值运算后,该值也加1,变成16才是呀。况且,后置++对其他变量j赋值后,i自身也加1了,

prePlus3:i=16,j=15

为什么对自己赋值后,结果就不一样呢?

实际上,不管是前置++还是后置++,都是先将变量的值加1.,然后才继续计算的,,二者之间真正的区别是:前置++是将变量的值加1后,使用增值后的变量进行运算的,而后置++是首先将变量赋值给一个临时变量,接下来对变量的值加1,然后使用临时变量进行运算,从效果上来讲,假设有如下程序片段:

 ;
 ;

那么第二行代码就相当于

; 
;

代码再改一下,改成后置++

 ;

那么第二行代码就相当于

int temp=i;//将i变量值赋给一个temp的临时变量,即temp=2
i+=1;      //将i加1,i值变成3
j=temp*30; //使用临时变量Temp进行运算,j的结果为60

进一步探索

接下来我们来研究一下前置++与后置++的区别,为了能更好的说明该问题,先列出一个非常简单的程序:

   {
     () {
           ;
           ;
    }
     () {
           ;
           ;
    }
}

找到DeepPlus.class的目录 下,使用命令:

javap -c  DeepPlus

其中javap是翻译命令,-c为显示代码反编译后的伪指令。输出:


我们可以看到两个方法post和pre:

细说post方法:

 ();
:

: 



: 


: 


:           , 



: 

:

继续看pre方法

 ();
:

: 




: 




:           , 

: 



: 

:

现在我们已经从指令的级别分析完了二者之间的差异。

前置++直接将变量的值加1,然后使用这个变量的值。而后置++是先将变量的值压入栈(暂时保存起来),然后将变量的值加1,之后使用压栈时变量的值。

总结

  1. 前置++与后置++都是先将变量的值加1,而不是前置++先加1然后运算,,而后置++先运算再加1。

  2. 从代码上来说,后置++先将变量赋给一个临时变量,然后将变量的值加1,接下来使用临时变量参与运算。

  3. 从指令上来说,后置++在执行增值指令iinc前,先将变量的值压入栈,执行增值指令后,使用的是之前压入栈的值。

逆水行舟,不进则退!希望大家都能踏踏实实地拥抱新技术!!!