Questo è direttamente ispirato a this question.
Esistono numerosi riferimenti/istruzioni che gli operatori bit a bit, se applicati ai booleani, non causeranno cortocircuiti. Quindi, in altre parole, boolean a = f() & g()
, dove f()
e g()
entrambi restituiscono booleano, sia saranno sempre valutati.
Tuttavia, JLS dice soltanto:Cosa (nelle specifiche) garantisce che "gli operatori logici non cortocircuitati non saranno in effetti in cortocircuito?
15.22.2 booleani operatori logici &, ^, e |
Quando entrambi gli operandi di un &, ^, o | gli operatori sono di tipo booleano o booleano, quindi il tipo di espressione di operatore bit per 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.
In che modo garantisce che entrambi gli operandi sono effettivamente valutati? Oltre a xor
, è ancora possibile interrompere e restituire il risultato se uno degli argomenti (e può essere secondo/a destra che deve essere valutato per la prima volta) viola la condizione.
Es. a & b
è necessario valutare solo b
in modo da valutare l'espressione su false.
Nota: non sto chiedendo se è implementato in questo modo (non cortocircuito) - certamente lo è.
sto chiedendo:
Would attuazione con corto circuito violare lingua norma?
Sì. Il testo standard indica i valori per entrambi i valori dell'operando, vale a dire che entrambe le espressioni devono essere valutate. – rsp