Zawsze myślałem, że &&
operator w Javie służy do sprawdzania, czy oba jego operandy boolowskie są true
, a &
operator jest używany do wykonywania operacji bitowych na dwóch typach liczb całkowitych.
Niedawno dowiedziałem się, że &
operator może również służyć do sprawdzania, czy oba jego operandy boolowskie są true
, jedyną różnicą jest to, że sprawdza operand RHS, nawet jeśli operand LHS jest fałszywy.
Czy &
operator w Javie jest wewnętrznie przeciążony? A może kryje się za tym jakaś inna koncepcja?
java
operators
boolean
bitwise-operators
Społeczność
źródło
źródło
Odpowiedzi:
& <- weryfikuje oba operandy
&& <- przestaje oceniać, jeśli pierwszy argument ma wartość fałsz, ponieważ wynik będzie fałszywy
(x != 0) & (1/x > 1)
<- oznacza to ocenę,(x != 0)
a następnie ocenę(1/x > 1)
i wykonanie &. problem polega na tym, że dla x = 0 spowoduje to zgłoszenie wyjątku.(x != 0) && (1/x > 1)
<- oznacza oceniaj(x != 0)
i tylko jeśli jest to prawda, obliczaj(1/x > 1)
więc jeśli masz x = 0, to jest to całkowicie bezpieczne i nie zgłosi żadnego wyjątku, jeśli (x! = 0) oszacuje jako fałsz, całość bezpośrednio oszacuje na fałsz bez oceniania(1/x > 1)
.EDYTOWAĆ:
exprA | exprB
<- oznacza to ocenę,exprA
a następnie ocenę,exprB
a następnie wykonanie|
.exprA || exprB
<- oznacza to ocenęexprA
i tylko wtedy, gdy jest tofalse
następnie ocenaexprB
i wykonanie||
.źródło
Poza tym, że nie jest leniwym oceniającym, oceniając oba operandy, myślę, że główne cechy operatorów bitowych porównują każdy bajt operandów, jak w poniższym przykładzie:
źródło
źródło
To zależy od rodzaju argumentów ...
W przypadku argumentów całkowitych pojedynczy znak ampersand („&”) jest operatorem „bitowym AND”. Podwójny ampersand („&&”) nie jest zdefiniowany dla niczego poza dwoma argumentami logicznymi.
W przypadku argumentów logicznych pojedynczy znak ampersand stanowi (bezwarunkowy) operator „logicznego AND”, podczas gdy podwójny ampersand („&&”) jest operatorem „warunkowym logicznym AND”. Oznacza to, że pojedynczy ampersand zawsze ocenia oba argumenty, podczas gdy podwójny ampersand ocenia drugi argument tylko wtedy, gdy pierwszy argument jest prawdziwy.
W przypadku wszystkich innych typów i kombinacji argumentów powinien wystąpić błąd w czasie kompilacji.
źródło
&& jest operatorem zwarcia, a & jest operatorem AND.
Spróbuj tego.
źródło
jest to określone w JLS (15.22.2) :
„Sztuczka” polega na tym, że
&
jest to całkowity operator bitowy, a także logiczny operator logiczny . Dlaczego więc nie, traktowanie tego jako przykładu przeciążenia operatora jest rozsądne.źródło
Myślę, że moja odpowiedź może być bardziej zrozumiała:
Istnieją dwie różnice między
&
i&&
.Jeśli używają logicznego AND
&
i&&
może być logiczneAND
, kiedy&
lub&&
w lewo i prawo wyrażenie doprowadzić wszystko prawda, cała operacja może być wynikiem prawda.kiedy
&
i&&
co logiczneAND
, istnieje różnica:gdy jest używane
&&
jako logiczneAND
, jeśli wynik lewego wyrażenia jest fałszywy, prawe wyrażenie nie zostanie wykonane.Weź przykład:
Jeśli używasz
&
:Inny przykład:
& może być używany jako operator bitowy
&
może być używany jakoAND
operator bitowy ,&&
nie może.Ze strony wiki:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
źródło
„&&”: - jest operatorem logicznym AND, który tworzy logiczną wartość prawdy lub fałszu w oparciu o logiczną relację jego argumentów.
Na przykład: - Warunek1 i Warunek2
Jeśli Warunek1 jest fałszywy, to (Warunek1 i & Warunek2) zawsze będzie fałszywy, to jest powód, dla którego ten operator logiczny jest również nazywany operatorem zwarcia, ponieważ nie ocenia innego warunku. Jeśli Warunek 1 jest fałszywy, nie ma potrzeby oceniania Condtiton2.
Jeśli Warunek1 jest prawdziwy, to jest oceniany Warunek2, jeśli jest prawdziwy, to ogólny wynik będzie prawdziwy, w przeciwnym razie będzie fałszywy.
„&”: - jest operatorem bitowym AND. Generuje jedynkę (1) na wyjściu, jeśli oba bity wejściowe są jednością. W przeciwnym razie daje zero (0).
Na przykład:-
int a = 12; // binarna reprezentacja liczby 12 to 1100
int b = 6; // binarna reprezentacja liczby 6 to 0110
int c = (a & b); // binarna reprezentacja (12 i 6) to 0100
Wartość c wynosi 4.
w celach informacyjnych zapoznaj się z tym http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html
źródło
&&
i||
nazywane są operatorami zwarć. Gdy są używane, for||
- jeśli wartość pierwszego argumentutrue
wynosi do , wówczas pozostałe argumenty nie są obliczane. For&&
- jeśli pierwszy operand ma wartośćfalse
, pozostałe z nich w ogóle nie są oceniane.więc
if (a || (++x > 0))
w tym przykładzie zmienna x nie zostanie zwiększona, jeśli byłatrue
.źródło
W przypadku wartości logicznych nie ma między nimi różnicy wyjściowej. Możesz zamienić && i & lub || i | i nigdy nie zmieni wyniku twojej wypowiedzi.
Różnica kryje się za sceną, w której informacje są przetwarzane. Kiedy poprawisz wyrażenie „(a! = 0) i (b! = 0)” dla a = 0 i b = 1, dzieje się tak:
Kiedy piszesz wyrażenie,
(a != 0) && ( b != 0)
gdy a = 0 i b = 1, dzieje się tak:Mniej kroków, mniej przetwarzania, lepsze kodowanie, szczególnie podczas wykonywania wielu wyrażeń logicznych lub skomplikowanych argumentów.
źródło
Poza tym && i || ponieważ są zwarte, należy również rozważyć pierwszeństwo operatorów podczas mieszania dwóch form. Myślę, że nie będzie od razu widoczne dla każdego, że wynik 1 i wynik 2 zawierają różne wartości.
źródło
& jest operatorem bitowym oraz używanym do sprawdzania obu warunków, ponieważ czasami musimy ocenić oba warunki. Ale operator logiczny && przechodzi do drugiego warunku, gdy pierwszy warunek daje prawdę.
źródło
wszystkie odpowiedzi są
great
i wydaje się, żeno
więcej odpowiedzi,is needed
ale po prostu chciałem zwrócić uwagę na coś na temat&&
operatora wywołanegodependent condition
W wyrażeniach korzystających z operatora && warunek - nazwiemy go
dependent condition
- może wymagać, aby inny warunek był prawdziwy, aby ocena warunku zależnego miała znaczenie.W takim przypadku warunek zależny należy umieścić po operatorze &&, aby zapobiec błędom.
Rozważ wyrażenie
(i != 0) && (10 / i == 2)
. Stan zależny(10 / i == 2)
musi operatora, aby zapobiec możliwości podziału przez zero.appear after
&&
inny przykład
(myObject != null) && (myObject.getValue() == somevaluse)
i jeszcze jedno:
&&
i||
są nazywane ocena zwarcie ponieważ drugi argument jest wykonywany lub oceniana argumentem nie do zonly if
first
not suffice
determine
value
expression
Odnośniki: Java ™ How To Program (wczesne obiekty), wydanie dziesiąte
źródło