2012-02-13 15 views
5

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?

+0

Sì. Il testo standard indica i valori per entrambi i valori dell'operando, vale a dire che entrambe le espressioni devono essere valutate. – rsp

risposta

4

Vedi JLS 15.7.2 Evaluate Operands before Operation

Il linguaggio di programmazione Java garantisce inoltre che ogni operando di un operatore (ad eccezione degli operatori condizionali & &, ||, e? :) sembra essere pienamente valutata prima di ogni parte del funzionamento stesso viene eseguito.

Quindi, se avete l'operatore &, entrambi operandi devono essere valutati prima che il risultato finale viene calcolato.

Inoltre, la sezione precedente richiede espressamente che l'operando di sinistra di qualsiasi operatore binario debba essere valutato per primo.

+0

Buona cattura! Grazie! – wmz

+0

Contattami mi ha colpito per _finding_ questa sezione. –

1

Il JLS afferma esplicitamente che la scorciatoia viene eseguita per condizionale o per il condizionale e. Spiega il comportamento del condizionale o/e in termini di operatori bitwise o/e. Quindi, sta enfatizzando che il taglio corto è una variazione nel comportamento degli operatori bit a bit.

Quindi, direi che l'utilizzo di scorciatoie violerebbe lo standard. Sicuramente violerebbe le aspettative degli sviluppatori.

15.24 Condizionale o operatore ||

Il & & operatore è come & (§15.22.2), ma valuta l'operando destro solo se il valore del suo operando sinistro è vero.

Problemi correlati