2010-06-30 7 views

risposta

64

Preferisco considerarlo come "bitwise vs. condizionale" piuttosto che "logico vs condizionale" poiché il concetto generale di "logico" si applica in entrambi i casi.

x & y // bitwise AND, 0101 & 0011 = 0001 
x | y // bitwise OR, 0101 | 0011 = 0111 

x && y // true if both x and y are true 
x || y // true if either x or y are true 

Modifica

A grande richiesta, Vorrei anche ricordare che gli argomenti vengono valutati in modo diverso. Nella versione condizionale, se il risultato dell'intera operazione può essere determinato dal primo argomento, il secondo argomento non viene valutato. Questo è chiamato valutazione di cortocircuito. Le operazioni bit a bit devono valutare entrambi i lati per calcolare il valore finale.

Ad esempio:

x.foo() && y.bar() 

Questo sarà solo chiamare y.bar() se x.foo() viene valutato come true. Viceversa,

x.foo() || y.bar() 

chiamerà solo y.bar() se x.foo() viene valutato come false.

+10

OK. Che ne pensi della valutazione pigra? Hai intenzione di dirlo? Perché se lo fai, posso cancellare la mia risposta più impopolare. –

+0

La valutazione lenta è un sottoinsieme del modo operativo operativo logico. Dovrebbe essere menzionato, ma è irrilevante per la domanda. –

+0

@ John Weldon: la domanda riguarda le differenze tra gli operatori. E la pigrizia è sicuramente una di queste. –

31
(x && y) 

è pigro. Valuterà solo se x è vero.

(x & y) 

non è pigro. sarà sempre valutato

+1

Questo è sbagliato, credo? Puoi citare? (Sono d'accordo con la prima affermazione, ma non la seconda) –

+14

Questa è solo metà della storia, e probabilmente la metà meno importante. –

+1

Certo, ma c'è dell'altro oltre a questo, no? Supponendo che xey non siano booleani? Senza menzionare la natura bit a bit di | e &, questa risposta manca qualcosa. – spender

11

Aggiornamento risposta - il mio originale era fuorviante e incompleto.

Per prima cosa dovrei scusarmi per molti dei miei commenti e risposte a questa domanda.

Dopo aver letto le specifiche, la distinzione tra operatori bit a bit e operatori condizionali è molto meno chiara.

Secondo la sezione 14.10 of ECMA-334:

Il &, ^, e | gli operatori sono chiamati gli operatori logici.

per operazioni intere:

1 L'operatore & calcola il bit logico dei due operandi, il | L'operatore calcola il bit logico OR dei due operandi e l'operatore^ calcola l'OR logico bit a bit esclusivo dei due operandi. 2 No sono possibili overflow da queste operazioni .

Secondo sezione 14.11:

Il & & e || gli operatori sono chiamati operatori logici condizionali . 2 Loro sono anche chiamati operatori di logica "cortocircuito" .

14.11.1

1 Quando gli operandi di & & o || sono di tipo bool, o quando gli operandi sono di tipi che non definiscono un operatore applicabile & o operatore |, ma lo fanno definiscono conversioni implicite di Bool, l'operazione viene elaborato come segue: 2 L'operazione x & & y è valutato come x? y: falso. 3 In altre parole, x è prima valutato e convertito in tipo bool. 4 Quindi, se x è vero, y è valutato e convertito in type bool, e questo diventa il risultato dell'operazione . 5 Altrimenti, il risultato di l'operazione è falso. 6 L'operazione x || y è valutato come x? true: y. 7 In altre parole, x è il primo valutato e convertito in tipo bool. 8 Quindi, se x è vero, il risultato di è true. 9 Altrimenti, y viene valutato e convertito in tipo bool e questo diventa il risultato dell'operazione .

14.11.2

1 Quando gli operandi & & o || sono di tipi che dichiarano un operatore applicabile definita dall'utente & o operatore |, entrambi seguente deve essere vero, dove T è del tipo in cui viene dichiarato il operatore selezionato: 2 Il tipo restituito e il tipo di ciascun parametro dell'operatore selezionato deve essere T. 3 In altre parole, l'operatore deve calcolare la logica AND o l'OR logico dei due operandi di tipo T, e deve restituire un risultato di tipo T. 4 T deve contenere dichiarazioni di operatore true e operatore false. Paragrafo 2 1 Un errore di compilazione si verifica se uno di questi requisiti non è soddisfatto. 2 Altrimenti, il & o || operazione viene valutata combinando definito dall'utente operatore vero o falso operatore con il selezionato operatore definito dall'utente: 3 Il operazione x & & y viene valutato come T.false (x)? x: T. & (x, y), dove T.false (x) è un'invocazione del operatore falso dichiarato in T, e T. & (x, y) è un invocazione del operatore selezionato & . 4 In altre parole, x viene prima valutato e l'operatore false viene invocato sul risultato a determinare se x è definitivamente falso. 5 Quindi, se x è definitivamente falso, il risultato dell'operazione è il valore precedentemente calcolato per x.6 Altrimenti, y viene valutato, e il operatore selezionato & viene richiamato dal valore precedentemente calcolato per xe il valore calcolato per y per produrre il risultato dell'operazione. 7 L'operazione x || y è valutato come T.true (x)? x: T. | (x, y), dove T.true (x) è una chiamata dell'operatore true dichiarato in T e T. | (x, y) è una chiamata dell'operatore selezionato | . 8 In altre parole, x viene prima valutato e l'operatore true viene invocato sul risultato per determinare se x è sicuramente true. 9 Quindi, se x è assolutamente true, il risultato dell'operazione è il valore precedentemente calcolato su x per x. 10 In caso contrario, y è valutato e l'operatore selezionato | viene invocato sul valore precedentemente calcolato per x e il valore calcolato per y per produrre il risultato dell'operazione . Paragrafo 3 1 In entrambe le operazioni, , l'espressione da x viene valutata solo una volta e l'espressione data da y non è valutata o valutata esattamente una volta. Paragrafo 4 1 Per un esempio di un tipo che implementa l'operatore true e l'operatore falso, consultare §18.4.2.

+4

'&', '|', e '^' sono sovraccarichi. Per due booleani, sono semplicemente operatori logici desiderosi (non condizionali) (ECMA-364 §14.10.3) –

+0

@ Matthew, questa domanda è posta più in generale che in riferimento ai booleani. –

+0

in realtà penso di non essere d'accordo. È chiaro dal secondo esempio che x e y sono booleani. Gli operatori bit a bit non entrano mai nella domanda. –