面試陷阱題:
int i=0; i =i++;
此時(shí)i值:
先來查看JavaP源碼:
Compiled from "Test.java"class Test { Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 //此處將i(0)讀取到棧中 3: iinc 1, 1 //自增 注意自增后并未入棧 6: istore_1 //出棧賦值,棧頂值為0 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PRintStream; 10: iload_1 11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 14: return}i最終為0;
根據(jù)一位大牛的回復(fù):
在這里jvm里面有兩個(gè)存儲(chǔ)區(qū),一個(gè)是暫存區(qū)(是一個(gè)堆棧,以下稱為堆棧),另一個(gè)是變量區(qū)。語句istore_1是將堆棧中的值彈出存入相應(yīng)的變量區(qū)(賦值);語句iload_1是將變量區(qū)中的值暫存如堆棧中。因?yàn)閕=i++;是先將i的值(0)存入堆棧,然后對(duì)變量區(qū)中的i自加1,這時(shí)i的值的確是1,但是隨后的istore_1又將堆棧的值(0)彈出賦給變量區(qū)的i,所以最后i=0。又因?yàn)閕=++i;是先對(duì)變量區(qū)中的i自加1,然后再將變量區(qū)中i的值(1)存入堆棧,雖然最后執(zhí)行了istore_1,但也只是將堆棧中的值(1)彈出賦給變量區(qū)的i,所以i=++i;的結(jié)果是i=1。
另外:java i++ ++i 中間變量緩存;
PS:http://blog.csdn.net/ffanfanm/article/details/12784489
故而,最佳實(shí)踐一:不要在單個(gè)的表達(dá)式中對(duì)相同的變量賦值超過一次。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注