2016-03-09 49 views
2

我想澄清一些關於Java中的三元運算符的疑問。Java三元運算符:與ART相似的行爲類似於可能的(彙編)嗎?

在Java中,它看起來像:x =(c?a:b)。從我閱讀和經歷的看來,它似乎被作爲if/else的分支來執行,這意味着只有一個語句被評估(a或b,但從來都不是)。我想知道它是否真的如此。

在C中,它可能會被編譯成有條件的移動時,其評估兩個表達式a和b。

是準確的,我想知道,如果它的Android代碼的也是如此。在安裝到具有最新操作系統的設備上時,知道Java字節碼實際上已轉換爲本機指令(請參閱Android Runtime(ART))。在ART之後出現有條件的移動是否有風險?

讓我們舉一個例子。一個基本類,其中將包括:

//class content 

int victoriesA = 0; 
int nonVictoriesA = 0; 
int totalCalls = 0; 

//...class content 

public int getIncrementedCounter(int goalsA,int goalsB){ 
    totalCalls++; 
    return (goalsA > goalsB ? ++victoriesA : ++nonVictoriesA); 
} 

public boolean testOpertor(){ 
    return (totalCalls == victoriesA + nonVictoriesA); 
} 

如果getIncrementedCounter是一個程序的執行過程中多次調用,將功能testOperator始終返回true? (假設代碼運行在單個線程上運行)

我知道,我應該只使用if/else分支就一定要走出困境,但我仍然不知道....

回答

3

按照Java Language Specification, chapter 15.25

在運行時,首先計算條件表達式的第一個操作數表達式。如有必要,對結果執行拆箱轉換。

所得布爾值然後被用於選擇任一第二第三操作數的表達式:

如果第一操作數的值是真實的,則選擇所述第二操作數的表達。

如果第一操作數的值是假,則第三操作數的表達被選擇。

作爲符合語言規範將意味着僅1的表達進行評估。

+0

謝謝你的鏈接。 – Gordak