2014-01-16 3 views
5

Я пытаюсь подготовиться к сертификации OCA Java и застрял в некоторых вопросах, связанных с заданием в условиях if. Может ли кто-нибудь объяснить мне причину различного поведения в коде ниже? По моей точки зрения, я просто положить те же два логических значения в «инклюзивной или» условие 6 раз ...Tricky Java: boolean assign in if condition

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 булевы, побитовые ИЛИ и логические ИЛИ эквивалентны, за исключением того факта, что второе выражение не оценивается в некоторых случаях для логического ИЛИ. (И приоритет;)) –

ответ

15

Разница в precedence. | имеет более высокий приоритет («привязывается более жестко»), чем =.

Так что:

if(b=true|_false()) 

эффективно:

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

Точно так же это:

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

эффективно:

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

В этих случаях назначение false в b происходит перед назначение true к b ... так b заканчивается время true. В любом другом случае задания выполняются в обратном порядке.

+0

Спасибо! Гораздо меньше трики, чем я думал, я не рассматривал вопрос о приоритете операторов –