2014-01-16 19 views
5

我正在嘗試爲OCA Java認證做好準備,並陷入了一些在if條件下處理賦值的問題。任何人都可以在下面的代碼中解釋不同行爲的原因嗎?根據我的觀點,我只是把同樣的兩個布爾值的「包容性或」條件的6倍......Tricky Java:如果條件中的布爾賦值

package pck; 

class SuperMain{ 
    boolean b; 
    public static void main(String args[]){ 
     new SuperMain(); 
    } 
    SuperMain(){ 
     if(_true()|_false()) 
      System.out.println(b); //1 - prints false 
     if(b=true|_false()) 
      System.out.println(b); //2 - prints true 
     if(_true()|(b=false)) 
      System.out.println(b); //3 - prints false 
     if((b=true)|_false()) 
      System.out.println(b); //4 - prints false 
     if(b=true|(b=false)) 
      System.out.println(b); //5 - prints true 
     if((b=true)|(b=false)) 
      System.out.println(b); //6 - prints false 
    } 
    boolean _true(){return b=true;} 
    boolean _false(){return b=false;} 
} 
+0

哪一個你不明白? – assylias

+0

您編寫的測試自己的代碼,還是來自某個教程的代碼?它不僅在條件內分配,還使用按位或。我假設認證考試有意將此類內容扔在那裏,但如果我在評論中收到了這些代碼,我會將其發回。我們在現實世界中不這樣做(好吧,有些是,但不是我的團隊)。 – shoover

+0

@shoover - 對於Java的布爾值,OR或OR邏輯是等價的,除了第二個表達式在某些情況下對於邏輯或不被評估。 (和優先;)) –

回答

15

的區別在於precedence|=具有更高的優先級(「綁定更緊密」)。

所以這個:

if(b=true|_false()) 

是有效的:

if (b = (true | _false())) 
    ... 

同樣這樣的:

if(b=true|(b=false)) 

是有效的:

if (b = (true | (b = false)) 

在這些情況下,falseb分配發生trueb之前分配......所以b最終被true。在其他任何情況下,作業都按照相反的順序進行。

+0

謝謝!比我想象的少三分,我沒有考慮運營商的優先權問題 –