2016-11-06 58 views
9

這是理解Java對算術運算評估的理論問題。由於+-具有相同的優先級,因此我不太瞭解Java如何評估以下表達式(兩個操作數之間有多於一個的+-運算符)。多個+和 - 運算符的Java優先級

public static void main(String[] args) { 
    int a = 1; 
    int b = 2; 
    System.out.println(a+-b); // results in -1 
    System.out.println(a-+b); // results in -1 
    System.out.println(a+-+b); // results in -1 
    System.out.println(a-+-b); // results in 3 
    System.out.println(a-+-+b); // results in 3 
    System.out.println(a+-+-b); // results in 3 
    System.out.println(a-+-+-b); // results in -1 
    System.out.println(a+-+-+b); // results in 3 
} 

從Java 8語言規範(§15.8.2):當施加到數字類型的兩個操作數,產生操作數的總和

二進制+運算執行加法。
二進制運算符執行減法,產生兩個數字操作數的差異。
[...]
如果操作數表達式沒有副作用,那麼加法是一個交換操作。
當操作數都是相同類型時,整數加法是關聯的。

我還注意到,每次#operator都是偶數,結果是一樣的,順序無關緊要。 但是當#operators奇怪時,這並不一定會影響結果。例如。在以下兩個表達式中,還有一個-+多,但結果是不同的。

System.out.println(a-+-b); // results in 3 
System.out.println(a-+-+-b); // results in -1 

有了這些信息,我仍然沒有看到模式或工作方式。

+0

我相信* a + -b *被執行爲* a +(-b)*。檢查出來 –

+1

@Sanket Makani' - '和'++'在這種情況下是不允許的因爲Java將其作爲增量/減量操作 – ncw

回答

9

在數學中,你會如何評價?

a - + - b 

添加一些括號幫助:

a - (+ (-b)) 

我們能做到這一點,因爲這並不違反優先的規則。

然後我們就可以開始減少:+ (-b)真的-ba - -b真的a + b,所以結果是1 + 2 = 3

讓我們來看看第二個:

a - + - + - b 
a - (+ (- (+ (-b)))) 
a - (+ (- (-b))) 
a - (+ b) 
a - b 
1 - 2 = -1 

數學工作那麼簡單的規則自然。

2

我相信-標誌否定表達式:

int a = 1; 
int b = 2; 
System.out.println(a+(-b)); 
System.out.println(a+-b); 

兩個打印-1。這是從oracle文檔:

一元減運算符;否定表達式

減號簡單變化後面數字的符號。如果b爲負數,則a+-b將返回3

2

它的評估,因爲它是在你如何做與加法和減法的數學計算。 在你的例子中,所有的計算都以較小的數字a=1開頭,那麼你就有-+之間的小數字和更大的數字b = 2之間的符號。例如當你做1 -- 2時,你正在做1+2,因爲2 -符號相互抵消變爲1 + 21 - 2將爲-1,因爲2(更大的數字有一個 - 符號,這使它成爲負整數,將1加到負整數增加了一個

2

這似乎是一個數學問題,它的價值......( - & - = +),( - & + = - )和(+ & + = +)

int a = 1; 
int b = 2; 
System.out.println(a+-b); // 1 +(-2) = 1-2 = -1 
System.out.println(a-+b); // 1-(+2) = 1-2 = -1 
System.out.println(a+-+b); // 1+-(+2) = 1-(+2) = 1-2 = 1 
System.out.println(a-+-b); // 1- + (-2) = 1- (-2) = 1+2 =3 
System.out.println(a-+-+b); // 1 - + - (+2) = 1 - - (+2) = 1-2 = -1 
System.out.println(a+-+-b); // 1+ - + (-2) =1 - + (-2) = 1+2 = 3 
System.out.println(a-+-+-b); // 1-+-+(-2) = 1 - - (-2) = 1 + (-2) = -1 
System.out.println(a+-+-+b); // 1 +- +- (+2) = 1 -- (+2) = 1+2 = 3