2014-06-11 27 views
0

我的疑問是爲什麼在下面的代碼中輸出分別是2和1? 這真的好嗎? 對於我的看法,方法'm'應該接收值1,因爲它在變量'i'上使用後綴運算符而不是前綴運算符。在帶方法調用的表達式中的Java postfix運算符優先級

public class PostfixDoubt { 

    public static void main(String[] args) { 
     int i = 1; 
     // why does m receive 2 as argument and not 1? 
     i = i++ + m(i); 
     System.out.println(i); 
    } 

    public static int m(int i) { 
     System.out.println(i); 
     return 0; 
    } 
} 

婁與javap的反編譯字節碼:

public class PostfixDoubt { 
    public PostfixDoubt(); 
    Code: 
     0: aload_0 
     1: invokespecial #8     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: iconst_1 
     1: istore_1 
     2: iload_1 
     3: iinc   1, 1 
     6: iload_1 
     7: invokestatic #16     // Method m:(I)I 
     10: iadd 
     11: istore_1 
     12: getstatic  #20     // Field java/lang/System.out:Ljava/io/PrintStream; 
     15: iload_1 
     16: invokevirtual #26     // Method java/io/PrintStream.println:(I)V 
     19: return 

    public static int m(int); 
    Code: 
     0: getstatic  #20     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: iload_0 
     4: invokevirtual #26     // Method java/io/PrintStream.println:(I)V 
     7: iconst_0 
     8: ireturn 
} 

回答

2

該操作

i++ 

遞增存儲在i變量的值,並返回其先前的值。當i重新評估作爲參數被傳遞到

m(i) 

使用新的,遞增的,值。


int i = 1; 
i = i++ + m(i); 

看起來像

1: 1 (i = 2) + m(i) 
2: 1 (i = 2) + m(2) 
3: 1 (i = 2) + Whatever value m(2) returns 
4: whatever value is the result of that addition 
5: that value is assigned to i 
+0

是啊,我明白了,但爲什麼當m(i)返回的是他的結果添加到1?如果我已經重新評估,應該是2.我錯過了什麼? – staroski

+0

@staroski看我的編輯。 'i ++'的值會生成一次。 –

+0

它看起來像我重新評估兩次。首先將它傳遞給m(i),然後再將它重新分配給i = staroski