2016-04-17 40 views
-4

Java是用來評估一個確定性表達式的算法嗎?請看下面的例子:Java是用來評估表達式確定性(不僅僅是確定的)的算法嗎?

int x = 1 + 2 + 3; 

我不要求計算的順序,即Java的第一次評估,然後表達「2」及「1」「3」從左至右,因爲它的定義由JLS在第15.7章中。 「評估訂單」。

我想知道,雖然它被定義爲第一個'1 + 2'被評估或雖然實現是自由的,首先評估'2 + 3'。

在此先感謝!

編輯:

我知道評估順序在Java和該表達式的結果被確定當然被定義。我想知道結果的計算方式是如何定義的。

我試着保持這個例子儘可能簡單,但顯然它太簡單了,不能適當地描述我的問題,所以我將通過T.J擴展這個例子。克勞德副作用:

public class Program { 
    public static void main (String[] args) { 
     int x = a() + b() + c(); 
     System.out.println(x); 
    } 

    static int a() { System.out.println("in a"); return 1; } 
    static int b() { System.out.println("in b"); return 2; } 
    static int c() { System.out.println("in c"); return 3; } 
} 

輸出將definetely是

in a 
in b 
in c 
6 

因爲從左至右按JLS 15.7 a,b和c的評估的方法。結果將永遠是6.但是VM是否有義務首先添加a的返回值和b的返回值,或者是否可以自由地獲得結果? (我認爲這是不以任何方式檢測,並沒有規定,但留下作爲一個實現細節,但我不知道)

EDIT2:

問題澄清

+1

呵呵,你的第2段回答你的第3段? JLS是每個實現都需要遵循的規範。 – Tunaki

+1

實現可以自由地對代碼進行重新排序,前提是它不會改變結果,即它必須產生與'(1 + 2)+ 3'相同的結果,儘管目前還不清楚爲什麼它會這樣做。 –

+2

在發佈這樣的問題之前,請閱讀JLS有關表達評估的內容。這裏全是拼出來的。 –

回答

1

是算法的Java用來評估表達式的確定性?

當然是了。編程語言是確定性的,這是相當重要的。別的,混亂。 (讓我們離開量子計算到一邊......)

yshavit正確地指出,1 + 2 + 3實際上是一個constant expression等樣在自己的類別。相反,讓我們假設三個變量:

int x = a + b + c; 

如果你問是否可以JVM,確定性,做了評價以不同的順序,它是免費提供的差異無法觀察

讓我們來擴展你的例子:

int x = f1() + f2() + f3(); 

...其中f1f2f3都有副作用。

除非JVM可以證明f1f2f3有沒有副作用,它has to call f1 first

15.7.1。先評估左手操作數

二元運算符的左側操作數在評估右側操作數的任何部分之前似乎已完全評估。

考慮到f1可能會影響返回值f2;或者他們可能有輸出等。

JVM可以首先評估b + c,因爲沒有副作用,但它不能首先評估f2() + f3(),除非它確實知道沒有副作用。

但這仍然是確定性的。

+0

編程語言在所有情況下都是確定性的並不重要,有時候允許它是非確定性的(或類似的)。通常情況下,你會希望程序員編程的方式會產生正確的結果(確定性或不確定性)。順便說一句,也有應用程序的非確定性行爲呢.. – skyking

+0

@skyking:我認爲你* *確定性*運行時確定性混淆*語言*確定性。一種語言將有明確的規則。某些操作可能在運行時表現出非確定性效果(來自用戶的閱讀輸入就是一個很好的例子),但這不是確定性的*語言*。我可以用* language *術語思考的唯一非確定性的例子是* undefined behavior *。 –

+0

仍然有語言允許他們沒有定義特定結果的構造或情況。也可能是結果僅限於指定的範圍(例如浮點計算的結果)。這並不意味着語言不可用,並不意味着混亂註定會出現。 – skyking

相關問題