2010-10-11 10 views
106

SupponendoL'operatore Java & = applica & o &&?

boolean a = false; 

Mi chiedevo se fare:

a &= b; 

equivale a

a = a && b; //logical AND, a is false hence b is not evaluated. 

o al contrario significa

a = a & b; //Bitwise AND. Both a and b are evaluated. 

risposta

111

Dal linguaggio Java Specification - 15.26.2 Compound Assignment Operators.

Un assegnamento espressione composto della forma E1 op= E2 è equivalente a E1 = (T)((E1) op (E2)), dove T è il tipo di E1, tranne che E1 viene valutata solo una volta.

Così a &= b; è equivalente a a = a & b;.

(In alcuni usi, il tipo-casting fa la differenza al risultato, ma in questo b deve essere boolean e il tipo pressofuso non fa nulla.)


In pratica, v'è poca differenza tra a = a & b; e a = a && b;. Se b è una variabile o una costante, il risultato sarà lo stesso per entrambe le versioni. C'è solo una differenza semantica quando la valutazione di b può avere effetti collaterali; cioè quando è una sottoespressione non banale.

Sul lato prestazioni, il trade-off è tra il costo di valutazione b, e il costo di un test e ramo del valore di a, e il potenziale risparmio di evitare un'assegnazione inutile a. L'analisi non è semplice, ma a meno che il costo del calcolo di b non sia banale, è probabile che la differenza di prestazioni potenziale tra le due versioni sia troppo piccola per essere valutata.

19

E ' l'ultimo:

a = a & b; 
30

vedere 15.22.2 of the JLS. Per gli operandi booleani, l'operatore & è booleano, non bit a bit. L'unica differenza tra && e & per gli operandi booleani è che per && è in cortocircuito (ovvero che il secondo operando non viene valutato se il primo operando viene valutato su falso).

Quindi nel tuo caso, se b è un primitivo, a = a && b, a = a & b e a &= b tutti fanno la stessa cosa.

+1

Così (un &= b;) non sarà corto circuito se b è una chiamata di metodo? c'è qualcosa come un operatore "&& ="? – is7s

+1

corretto. b() è chiamato. Non c'è un operatore && =. – stew

+1

Sembra che questo non risponda alla domanda; l'OP sapeva già di corto circuito. –

0

mi sono imbattuto in una situazione simile usando booleani dove volevo evitare di chiamare b() se fosse già falso.

questo ha funzionato per me:

a &= a && b() 
+21

Per evitare ridondanze (consentendo comunque cortocircuiti), è sufficiente scrivere 'a = a && b()'. –