2014-01-20 49 views
0

我理解Java中的後增量和預增量是如何工作的,並且我已經閱讀了其他人關於同一主題的無數其他線程/問題。但!我還沒有學習爲什麼事後遞增比Java中的預遞增具有更高的優先級。爲什麼後增加的優先級高於Java中的預增?

有誰知道?

據我所知,後遞增具有比預遞增更高或更低的優先級不會影響您的程序的結果,因爲沒有其他一元運算符可能會干擾後/預增量。此外,++不是二元運算符,因此它不會干擾+, - ,*,/和%。所以,爲什麼?爲什麼事後遞增具有比預遞增更高的優先級?

,我會非常高興,如果有人能賜教! :)

編輯:這裏有一個規定優先級規則/水平Java的一個官方網站:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

EDIT2:對於大家downvoting這個重複的問題,請不要。這是Java,而不是C++等。我已經搜索並沒有在Java中找到重複。編輯3:我的動機是這樣的:Java的製作使後增加比先增量具有更高的優先級,我還沒有看到任何結果根據這些規則而不同的例子。所以,我不明白爲什麼後/預遞增不具有優先

+0

您是否有任何代碼可以證明您擁有比另一個更高的優先級? –

+0

要麼接受來自C的優先權,要麼去問James Gosling或Dennis Ritchie。通常由那些想要做出令人髮指的事情的人們提出,並提供一些沒有理性的人永遠不會寫的代碼示例。我發現它實際上回到B,C的前身B. – duffymo

+0

@Rohit Jain這裏有證據表明,後增加事實上比Java中的預增量具有更高的優先級(指的是此表中的第1和第2級)http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Mistylaneous

回答

1

你需要問Java的設計者知道爲什麼他們所做的設計調用的同一水平。

但我相信,這只不過是用C和C++的一致性。

參見:

爲了記錄,我認爲前綴和後綴運算符具有不同的優先級是非常重要的。如果它們具有相同的優先級,那麼類似於++a++就有兩個可選的解析...和兩個替代的含義。


下面是一個例子,其中操作者的優先級將成爲一個可觀察到的差異:

public static volatile a = 42; 

public void busywork() { 
    while (true) { 
     ++aa--; // ... assuming this was valid Java code .... 
    } 
} 

現在創建2個線程,一個調用busywork,第二採樣的a值。根據相對運算符的優先級,您應該能夠觀察到a的不同值集合;即根據現行規則{41, 42}。如果優先級是爲後和預增量和減量相同的,那麼這將是編譯器具體你是否看到{41, 42}{42, 43}

(當然,有兩個有效的解析樹將會使生活編譯器規格和編譯器實現者更加複雜。)

+0

'++ a ++'可能有兩個解析,但兩者的結果相同:語法錯誤。原因:在Java中,\ * crement運算符評估爲「rvalue」,與C相反。不同優先級的理由仍然存在(解析錯誤的唯一性),但它只與解析器相關。 –

+0

@MarkoTopolnik - 同意。但是我可能(懶惰地)談論前/後綴優先級的普遍問題,而不是Java問題的特定問題。另一點是,在Java案例中,除非'a'被聲明爲'volatile',否則(假設的)語義差異可能是不可觀測的。 –

+0

當然,我深入瞭解---只是OP後來增加了兩個筆記,試圖強調他知道C端,並且特別要求Java的特殊情況。 –