2012-11-22 83 views
0

我有一個問題,
Java,確實Math.min綁定比++更緊?
讓我用一個例子來說明,也許有人可以向我解釋爲什麼我會得到我得到的結果。後置操作有趣的行爲()

這是我跑的方法:

private static void testIncrement() { 
    int x=10; 
    System.out.println(x++); 
    System.out.println(x); 

    x=10; 
    System.out.println("-----------"); 
    System.out.println(++x); 
    System.out.println(x); 

    x=10; 
    System.out.println("-----------\n"+x); //10 
    x=Math.min(255, x++); 
    System.out.println(x); **//x=10 WHY NOT x=11?** 

    x=10; 
    System.out.println("-----------\n"+x); 
    x=Math.min(255, ++x); 
    System.out.println(x); 
} 

的結果是:

10 
11 
----------- 
11 
11 
----------- 
10 
10 
----------- 
10 
11 

在這裏我把//x=10 WHY NOT x=11?
行我不知道爲什麼x是10而不是11,也許有人可以向我解釋這一點。

看起來好像Math.min創建了x(現在是10)的副本,它用來做Math.min。然後原始x從10增加到11,但仍然爲10的副本從Math.min出來並覆蓋增加的那個。

這是否有意義? 有沒有人有解釋爲什麼x是10而不是11在這種情況下?

感謝

PS - 我完全理解How do the post increment (i++) and pre increment (++i) operators work in Java?

+0

因爲在將值10傳遞給Math.min方法後,x遞增。但在分配之前。 –

回答

4

讓我們解構這一行:

x = Math.min(255, x++); 

x++的意思是「記住x原始值;然後增加x,那麼價值表達式是原始值「。所有這一切發生在之前。所以它相當於:

int tmp = x;    // x = 10, tmp = 10 
x = x + 1;     // x = 11, tmp = 10 
x = Math.min(255, tmp); // x = 10 

希望這應該說清楚。特別是,這與Math.min本身無關 - 它只是表現爲正常的方法調用。有關更多詳細信息,請參見section 15.14.2 of the JLS

+0

我同意,但爲什麼我的程序輸出10次而不是11次。畢竟,它是在執行一個後增量。任何想法? – Adrian

+0

@Adrian:增量是在評估表達式之後,但*之前*從方法調用返回的值的賦值...因此'x'的值最終爲10(這是'Math.min '返回)。閱讀「擴展」 - 我會添加一些評論。 –

+0

哦,我看到它,我錯過了x = Math.min(255,tmp)中的溫度。謝謝! :) – Adrian