2011-03-17 36 views
2

我知道數組運算符具有優先權。然後是二元關節運算符*,/,%。然後+和 - 它們是低優先級。Java中的算術運算符(初學者問題)

但我很困惑,在這個例子中,java將首先解決哪個問題。 如果我們有2個運算符具有相同的優先級,那麼將首先在java中使用哪個運算符?

謝謝。

int x = y = -2 + 5 * 7 - 7/2 % 5; 

如果有人能爲我解決這個問題,並逐個給我解釋一下。因爲這總是讓我在考試中感到困惑。

+0

它是基於BODMAS規則 - 支架關司乘Addidition減法秩序。 – Mahesh 2011-03-17 11:12:05

+2

如果您不確定運算符的優先級,那麼只需添加額外的括號即可。它沒有任何缺點,比如讓代碼變慢,並且在很多情況下使代碼更具可讀性。 – RoToRa 2011-03-17 11:14:32

+0

非常感謝你們! SOF ROCKS !!!! – 2011-03-17 11:43:24

回答

8

如果運算符具有相同的優先級,那麼它們將從左到右進行評估。

tutorial

當相同的優先級的 運營商出現在同一表達,規則必須 支配後者首先被計算。 除 賦值操作符之外的所有二元運算符都從左到右評估爲 ;分配 運營商從右到左進行評估。

在表達,7/2 % 5/%具有相同的優先級,所以從左到右7/2 = 33 % 5 = 3

最高優先級賦予* /%。這裏是你的例子細分:

-2 + 5 * 7 - 7/2 % 5 
= -2 + (5 * 7) - (7/2 % 5) 
= -2 + 35 - (3 % 5) 
= -2 + 35 - 3 
= 30 
+1

這正是我想知道的(從左到右!)我在Fortran75和Java之間感到困惑。 TY! – 2011-03-17 11:19:32

3

y將被賦予值-2 + 5 * 7 - 7/2 % 5。然後x將被分配y的值。

算術表達式會像評估:

-2 + (5 * 7) - ((7/2) % 5) 

Here's Java的運算符優先級的解釋。

+1

當使用四空間代碼格式時,請勿使用反引號 – HyperNeutrino 2015-06-02 17:15:28

1
int x = y = -2 + 5 * 7 - 7/2 % 5; 

是相同

int x = y = (-2 + ((5 * 7) - ((7/2) % 5))); 

/*和%(乘法)的具有相同的優先級和它們的關聯被左到右。
+和 - (添加劑)具有相同的優先級,並且它們的關聯從左到右。乘法運算優於加法運算。

2

這看起來像你需要閱讀的內容:Java Operators Tutorial

閱讀教程,然後自己寫一個示例程序並進行操作,直到對操作符優先級滿意爲止。這是學習的最佳方式。

0

不完全相關,但你可能會發現這一點。它與序列點有關,它是程序中的一些點,它們本質上是編譯器確保一切都同步的點。它出現在SO上,因爲這個問題是什麼

x = x++; // Operator prcedence and/or sequence point problem; 

是做什麼的?或者更糟

x[i]=i++ + 1;// sequence point problem 

Why does this go into an infinite loop?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

+0

在Java中,這裏沒有問題,因爲左操作數總是在正確的操作數之前被計算(或者至少,程序必須具有與以這種方式完成的結果相同的結果)。 – 2011-03-17 12:32:18

+0

看看第一個鏈接「爲什麼會進入無限循環?」。它是Java代碼 的示例,而(x <3)x = x ++; System.out.println(x); } 它進入一個無限循環,因爲在x增加後x的預增值被分配給x。 – Jaydee 2011-03-17 12:57:39

+0

我應該提到序列點問題並沒有真正涉及到java,它是更多的C/C++,但是Java中的評估順序並不總是很明顯。所以在這方面你是對的。 – Jaydee 2011-03-17 13:12:58