2013-05-28 104 views
1

通過Java運算符優先級表:邏輯運算符優先級

'|'邏輯或運算符的優先級高於'& &'的邏輯AND運算符。

我使用以下代碼檢查上述事實

int y = 5; 
int x = 2; 
if( x++ > 2 && ++y > 2 | true ) 
; //do nothing 
System.out.println("x = " + x + " y = " + y); 

但上面的行給出輸出作爲 -

x = 3 y = 5 

表示X ++首先評估。

即使我把括號放在周圍的條件下|

if( x++ > 2 && (++y > 2 | true)) 
; 

但我仍然得到相同的輸出。

爲什麼運算符優先級在這種情況下不起作用?

回答

5

這不是邏輯運算符。這是一個按位運算符。它會評估一切 - 也就是說,它不會短路 - 如果有什麼東西翻轉到1,它將保持在1直到否定。

這裏的這些言論會如何評價:

  • x++ > 2 && ++y > 2 || true - >true。我們失敗的邏輯與,但成功的邏輯或。由於短路,我們不會繼續評估邏輯AND的任何部分,因爲x > 2是錯誤的。

  • x++ > 2 && (++y > 2 || true) - >false,因爲我們將由於x > 2短循環不成立。

如果你真的不想要的短路行爲,然後用按位與,以及,你會得到你預期的評價塊。

x++ > 2 & ++y > 2 | true仍然將評估爲true,但X 的y的值將分別變更爲36

+1

Actully我使用| oprator有意,如果|運算符具有比&&高的優先級,那麼爲什麼&&比|更早執行。 –

+0

我不這麼認爲。您將在邏輯AND的任一側應用所有按位運算,然後應用邏輯AND。你也會得到一點紅鯡魚 - 你實際上不會在邏輯塊中做任何事情,所以你怎麼能絕對肯定你沒有得到你想要的結果呢? – Makoto

+0

因爲如果| evalute before &&,那麼y應該有6個輸出。 –

2

|是按位或運算符。您正在尋找||。它是相似的,但不同之處在於它具有更高的優先級並且不適用於短路評估。

我明白你現在真正想問什麼。您想知道爲什麼如果&&的優先級最低,那麼在最後纔會對其餘的語句進行評估。因此,在

x++ > 2 && ++y > 2 | true 

應該評估x++ > 2,然後++y > 2 | true終於申請&&。那麼,答案是&&適用於短路評估。當然,它可以評估一切,然後應用其效果,這就是按位運算符所做的。然而,它不會因爲

if (a && b && ...) 

應該是類似的行爲

if (a) { 
    if (b) { 
     ... 
    } 
} 

運算符優先級如您所願,但是,評估被提前終止,因爲運營商的財產。所以回到

x++ > 2 && ++y > 2 | true 

我們看到,x++ > 2是假的,所以++y > 2 | true不計算。

+0

不,我查找|運營商。如果|運算符具有比&&高的優先級,這與爲什麼&&比|執行之前要高。 –

+0

@VijendraSingh我明白你的意思了。我編輯了我的答案。 – Zong

+0

@ZongLi你可以顯示代碼是如何解析的。 '(x ++> 2)&&(++ y> 2 | true)'。 –

1

試試這個

if( x++ > 2 && ++y > 2 || true ) 

您使用bitwise運營商不logical操作

Operators in java

0

因爲無論你放在括號,它​​將開始從左至右因爲它的情況下, & &,它優化了檢查第一個條件,它是假的,那麼爲什麼要去第二個條件,否事件大括號,其次x ++將得到執行,條件變爲false,所以它打印的是相同的輸出,但是當你確實說出使用||時。

class Test{ 
public static void main(String[] args) { 

    int x=2,y=5; 
    if( x++ > 2 || (++y > 2 | true)) 
     ; 

    System.out.println(x +" "+y ); 

} 
} 

它將打印3 6因爲||發生,第一個條件成爲假,但當第二個條件成立時,++ y> 2被評估爲真|布爾值之間給出輸出的基礎上按位或,true OR true是真實的。

1

即使運算符|具有更高的優先級,運算符在程序檢查是否需要計算右邊(&&)時也未發現。

考慮陳述(true && true | true)。這是如何計算的:

  1. 檢查(true && ...)以查看是否需要進一步的操作(這是這種情況)。
  2. 更高優先級:執行操作(true | true) - >true
  3. 優先級較低:執行操作(true && true) - >true

在你的情況下,由於(x++ > 2)給人false&&右手側是從來沒有碰過。

0

邏輯運算符:(& &,|| &,|和^)可以僅用於評價2個 布爾表達式。

& &和&之間的區別是,& &操作 不會打擾測試右操作數,如果左邊的計算結果爲假,因爲& &表達的 結果永遠是正確的。

||和| ||是 ||如果左邊的計算結果爲 爲真,操作員不會打擾測試右邊的操作數,因爲結果在該點上已經是真實的。

按位運算符:(&,|和^)也可以稱爲「按位」運算符。按位運算符逐位比較兩個變量,並返回一個變量 ,該變量的位數已根據所比較的兩個變量是否爲「開」(&),其中一個或另一個「on」( |),或者確切地說 一個「開」(^)。