2012-06-22 5 views
13

Zawartość obu poniższych czy bloki powinny być wykonywane:Czy istnieje różnica między używaniem operatora logicznego lub operatorem bitowym w bloku if w Javie?

if(booleanFunction() || otherBooleanFunction()) {...} 
if(booleanFunction() | otherBooleanFunction()) {...} 

Więc jaka jest różnica między używaniem | lub używając ||?

Uwaga: Zajrzałem do tego i znalazłem własną odpowiedź, którą zamieściłem poniżej. Proszę, popraw mnie lub daj swój własny pogląd. Na pewno jest miejsce na ulepszenia!

+1

Nie rozumiem tego pytania, zadajesz pytanie, na które sam odpowiesz - zanim ktokolwiek może odpowiedzieć? – Nim

+1

prawdopodobnie odznakę rolnictwa? – Durandal

+9

@Nim and Durandal: Hmm .. Być może przegapiłem punkt, ale według [this] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your -own-questions /) Właściwie dobrze jest odpowiedzieć na własne pytania, jeśli uważasz, że może to być istotne dla innych. Rozwiązałem własne pytanie i pomyślałem, że będę się nim dzielić, więc zadałem sobie trud udokumentowania tego tutaj. Nie chciałbym nikogo urazić – Miquel

Odpowiedz

11

Operator logiczny działa na bajtach, a operator bitowy działa na bitach. W tym przypadku, efekt będzie taki sam, ale są dwie różnice:

  1. Operator bitowe nie jest przeznaczony do tego, co sprawia, że ​​trudniejsze do odczytania, ale najważniejsze
  2. operatora logicznego OR oceni pierwszy warunek. Jeśli to prawda, to nie ma znaczenia, co kolejne wyniki stan w, wynik będzie prawdziwy, więc druga klauzula nie jest wykonywany

Oto niektóre przydatny kod to udowodnić:

public class OperatorTest { 

    public static void main(String[] args){ 
     System.out.println("Logical Operator:"); 
     if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){ 
      //doNothing 
     } 

     System.out.println("Bitwise Operator:"); 
     if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){ 
      //doNothing 
     } 
    } 

    public static boolean sayAndReturn(boolean ret, String msg){ 
     System.out.println(msg); 
     return ret; 
    } 
} 
34

Oba mają różne zastosowania. Chociaż w wielu przypadkach (w przypadku booleans) może się wydawać, że mają ten sam efekt, ważne jest, aby zauważyć, że logiczne-OR jest zwarciem, co oznacza, że ​​jeśli jego pierwszy argument jest prawdziwy, to drugi argument jest pozostawiony nieoceniony. Operator bitowy ocenia oba argumenty niezależnie.

Podobnie, logiczne-AND jest zwarciem, co oznacza, że ​​jeśli jego pierwszy argument jest fałszywy, to drugi pozostaje nieuznany. Znowu bitowe-AND nie jest.

Można to zobaczyć w akcji tutaj:

int x = 0; 
int y = 1; 
System.out.println(x+y == 1 || y/x == 1); 
System.out.println(x+y == 1 | y/x == 1); 

Pierwsza instrukcja print działa dobrze i zwraca true, ponieważ pierwszy argument wartość true, a więc ocena zatrzyma. Druga instrukcja print błędy, ponieważ nie jest zwarcie i napotyka na dzielenie przez zero.

4
if(booleanFunction() || otherBooleanFunction()) {...} 

W ten warunek booleanFunction() powraca true następnie otherBooleanFunction() nie będzie stracony.

if(booleanFunction() | otherBooleanFunction()) {...} 

Ale operatory bitowe obie funkcje - booleanFunction() i otherBooleanFunction() będzie wykonywany bez względu booleanFunction() powraca true lub false

6

dla programistów, jest tylko jedna różnica.

  1. Twoje operatory logiczne są logiczne, tj. testują tylko jeden warunek i na tej podstawie uzyskują wynik.

booleanFunction() || otherBooleanFunction() będzie prawdą, jeśli jedna z nich jest prawdziwa. podobnie, booleanFunction() & & otherBooleanFunction() będzie fałszywe, jeśli którekolwiek z nich jest fałszywe. Dlaczego przetestować drugi? to właśnie robią operatorzy logiczni.

Ale bitowe sprawdzają oba. Częste stosowanie tej koncepcji jest następujące.

if(someObject != null && someObject.somemethod()) 

Tak więc, w tym przypadku, jeśli zastąpić && przez & następnie czekać na katastrofę. Niedługo pojawi się nieprzyjemny wyjątek NullPointerException ...

0

Różnica między operatorem logicznym bitowego a d - 1. Operator bitowy działa na bit, podczas gdy operator logiczny działa na wyciągu. 2. Bitowy i jest reprezentowany przez &, gdy jest logiczny i jest reprezentowany przez & &. 3. Bitowy lub jest reprezentowany przez | logiczny lub reprezentowany przez ||.

Powiązane problemy