2015-12-21 136 views
3

我有一個簡單的Java表達式,如下所示。基於Operator Precedence table,我預計這種表達式將零異常返回師(因爲定位後增量運算符的優先級最高)和預期結果表達式將如下所示:Java後增加和預增量行爲

2 + 2 + 5/0 

但結果是7,爲什麼呢? (通過實驗的點點我發現,所有的運營商都因爲某些原因指定的值爲1,但這並不意義,我的情況下,優先級表是正確的)

int intCountOperator = 0; 
unaryOperand = ++intCountOperator + intCountOperator + 5/intCountOperator++; 
System.out.println(unaryOperand); // Prints 7 
+0

這是因爲從左到右的評估順序,它與運算符優先級正交。 –

回答

2

運算符優先級不控制計算順序。它僅控制如何讀取表達式。例如,由於乘法具有比加法更高的優先級,所以x + y * z被讀爲x + (y * z),而不是(x + y) * z。然而,它不會改變,首先評估x,然後y,最後z

舉一個很好的例子++--比較困難,因爲通常只有一個讀數是合理的。但是,您可能會注意到y - x++編譯時沒有錯誤(如果xy是數字變量)。如果++的優先級低於-,則將評估爲(x - y)++,這將不會編譯。

由於運算符優先級,你的表達被評價爲:

(++intCountOperator) + (intCountOperator + (5/(intCountOperator++))); 

但評價爲了不被它改變。

2

從左至右計算表達式:

unaryOperand = ++intCountOperator + intCountOperator + 5/intCountOperator++; 
         1   +   1  + 5/1     = 7 

注意的是,運營商在您所期望的順序進行評估,即1 + 1 + (5/1) = 1 + 1 + 5 = 7,但所有這些表達式的操作數從左至右評估。

1

評估的順序是從左到右,而不是從右到左。所以你得到的結果是正確的。

unaryOperand = ++intCountOperator + intCountOperator + 5/intCountOperator++; 

實際上是

unaryOperand = 1 + 1 + 5/1; = 7 
+0

謝謝,但是我感到有些驚訝,期待最高優先級的運營商首先被評估。就像我在評估5 + 6/3時首先評估除法,然後添加(因爲優先) –

+0

Java * always *從左向右評估操作數。運算符優先級告訴您這些操作數隨後組合的順序。 –

+0

後者它首先評估5/1然後添加所以wbat是問題。唯一改變的是PREfixe算子的評價,無論如何它在表中具有更高的優先級。 – 2015-12-21 14:04:11