2016-10-04 139 views
0

決定操作員的操作順序時,我很困惑以下兩個說法。確定操作員的操作順序

  1. 聲明將從左到右執行。
  2. 它將根據運營商的優先順序執行。

下面的代碼從左至右執行向右

int i=5;  
boolean b = i<5 && ++i<5;//line2 
System.out.println(i);//prints 5 
//left to right execution in line2. 
//< is executed and ++ is not.Even though ++ has higher precedence. 

但下面這段代碼似乎遵循優先順序:

int a=1,b=1,c=1; 
boolean b = a==b&&b==c;//line2: (a==b)&&(b==c) 
/* In line2 code would not run from left to right. 
First a==b is evaluated then b==c and then && operator.*/ 

我也問過部分這個問題here但我以前不得到很好的足夠的解釋。 有人可以澄清?

+0

子結果從左到右進行評估。我相信這是你對上一個問題的迴應 –

回答

0

作業從右向左進行。在你的情況下,boolean b將被分配到任何右邊的表達式計算結果爲:

a==b&&b==c 

注意賦值運算符在優先級上都比邏輯/位運算符不同的規則(即=不具備與==&&相同的優先權)。

0

我認爲你需要了解邏輯AND和OR。

something && somethingElse - 試想一下表達。只有兩個值都是真的,它纔會返回true。如果兩者都是錯誤的,或者其中一個錯誤 - 返回錯誤。所以,假設第一部分實際上是假的(something=false)。就像我說的那樣,如果這個表達式中的任何內容都是錯誤的,那麼就沒有必要走得更遠了,因爲不管第二個錯誤是什麼,它都會返回錯誤。這就是爲什麼在你的第一個例子中,它不會再進一步​​ - 沒有必要,i已經不小於5,所以沒有理由檢查第二部分,因爲它已經是假的了。

在你的第二個例子中,a==b是真的,但是我們不能返回true,我們需要檢查第二個,因爲就像我說過的,如果第二個是false,那麼它必須返回false。所以表達式需要進一步檢查第二部分。不像第一個例子我們可以停下來,在這裏我們需要繼續檢查。

說到OR(||)規則是不同的。只有一個部分需要是真實的(這就是爲什麼它被稱爲或者,這個或那個,並不重要,一個事實就足夠了)。因此,如果第一部分是真的,那麼無論如何我們都可以返回,但如果第一部分是假的,那麼無論如何我們都需要繼續前進,因爲第二部分可能是真的。

0
i<5 && ++i<5;//line2 
  1. & &
  2. [& &] EVAL LHS:ⅰ< 5至假
  3. [& &跳到RHS:++我< 5和產生假

和 // line2:(a == b)& &(B == c)中

a==b&&b==c; 
  1. & &
  2. [& &] EVAL LHS:一個== b鍵真
  3. [& &] EVAL RHS:乙== c鍵真實,產量真實

&&是一個快捷操作rator不評估右側。

優先級對於二元運算符很重要。一元運算符的優先級不能對任何東西重新排序,但傳統上它具有更高的優先級,因爲它更緊密地綁定到最終值,特別是對於後綴運算符。

前綴運營商++具有重要的特點,即它應用了任期評價之前,它被調用。

不用說,上面的使用是值得被槍殺了,掛在最近AVL樹,分層和羽毛被趕出城。