21

Recentemente ho visto un codice utilizzando questo:Java booleano | = operatore

boolean val = something(); 
val |= somethingElse(); 

parte interessante è | = (binario simili) operatore fatta su booleano tipo primitivo.

Mi ha sorpreso che | = esiste per booleano, come se fosse un tipo intero, e ha cercato le specifiche Java per questo operatore, ma non è riuscito a trovarne.

Sarei curioso se l'operando di destra viene valutato se il valore di sinistra è già vero.

Qualcuno può indicarmi le specifiche Java di questo?

+4

È semplicemente val = val | qualcos'altro(); // somethingElse() dovrebbe tornare booleano.È un OR standard –

+0

@SudhanshuUmalkar lo sa, chiede le specifiche in un documento. – Juvanis

+1

la risposta è qui dudes: http://stackoverflow.com/q/2486472/544983 – Juvanis

risposta

25

Dal JLS:

15.26.2. Compound Assignment Operators

Un'espressione assegnazione composta della forma E1 op= E2 è equivalente a E1 = (T) ((E1) op (E2)), dove T è il tipo di E1, eccetto quello E1 viene valutato solo una volta.

15.22.2. Boolean Logical Operators &, ^, and |

Quando entrambi gli operandi di un &, ^ o | operatore sono di tipo boolean o Boolean, allora il tipo dell'espressione operatore binario è boolean. In tutti i casi, gli operandi sono soggetti alla conversione di unboxing (§5.1.8) secondo necessità.

Per |, il valore risultato è falso se entrambi i valori dell'operando sono falsi; altrimenti, il risultato è vero.

Ciò significa che

val |= somethingElse(); 

è strettamente equivalente a

val = val | somethingElse(); 

(supponendo somethingElse() rendimenti boolean o Boolean).

Sarei curioso se l'operando di destra viene valutato se il valore di sinistra è già vero.

Sì, sarebbe valutata, dal momento che | non lo fa corto circuito:

15.7.2. Evaluate Operands before Operation

Le garanzie linguaggio di programmazione Java che ogni operando di un operatore (ad eccezione degli operatori condizionali &&, || e ? :) sembra essere completamente valutato prima di eseguire qualsiasi parte dell'operazione stessa.

15.24. Conditional-Or Operator ||

Così, || calcola lo stesso risultato | su boolean o Boolean operandi. Differisce solo nel fatto che l'espressione dell'operando di destra è valutata condizionalmente piuttosto che sempre.

2

Gli operatori di logica bit a bit avranno lo stesso effetto degli operatori logici "normali" sui booleani.

Da Java Language Specification 15.22:

Quando entrambi gli operandi di un &,^o | gli operatori sono di tipo booleano o booleano, quindi il tipo di espressione dell'operatore bit a bit è booleano. In tutti i casi, gli operandi sono soggetti alla conversione di unboxing (§5.1.8) secondo necessità.

Per &, il valore del risultato è true se entrambi i valori di operando sono veri; altrimenti, il risultato è falso.

Per ^, il valore del risultato è true se i valori dell'operando sono diversi; altrimenti, il risultato è falso.

Per |, il valore del risultato è falso se entrambi i valori dell'operando sono falsi; altrimenti, il risultato è vero.

L'unica vera differenza è che gli operatori bit a bit non possono essere utilizzati per la valutazione del cortocircuito.

Ad esempio, questo codice gettare NullPointerException:

Boolean b1 = new Boolean(true); 
Boolean b2 = null; 
if (b1 || b2) { 
    //no null pointer here; 
} 
if (b1 | b2) { 
    //null pointer here; 
} 
2
>>I'd be curious if right operand is evaluated if left value already is true. 

operatori bit per bit (come |, &, ..) valutano entrambe le parti, prima del completamento.

Gli operatori logici (come &&, ||, ..) possono saltare la valutazione della seconda parte in alcuni casi. Questo è chiamato short-circuit.

0

Non è binaria si tratta di un "OR" dichiarazione mezzi logici

val |= {something else} 

è stessa del espressione booleana:

val == val or {something else} 

che è comprensivo o (regolare o utilizzati nelle espressioni di matematica e informatica)

In alcuni linguaggi di programmazione o rilevato da due || segni e in alcuni di uno | uno di questi è SQL e tutti i linguaggi di database che conosco DTD JSON, ecc.