2009-08-14 23 views

risposta

30

in C (e altre lingue probabilmente) un singolo | o & è un confronto bit per bit.
Il doppio || o && è un confronto logico.
Edit: Assicurarsi di leggere il commento di Mehrdad sotto per quanto riguarda "senza corto circuito"

In pratica, dal momento che true spesso è equivalente a 1 e false spesso è equivalente a 0, i confronti bit per bit a volte può essere valido e restituisce esattamente lo stesso risultato.

C'era una volta un componente software mission-critical su cui è stato eseguito un analizzatore di codice statico e si faceva notare che veniva utilizzato un confronto bit a bit dove avrebbe dovuto essere un confronto logico. Poiché è stato scritto in C e grazie alla disposizione dei confronti logici, il software ha funzionato bene con entrambi. Esempio:

if ((altitide > 10000) & (knots > 100)) 
... 
+22

In C# (che è un linguaggio fortemente tipizzato,) usando | e & sulle variabili booleane risulterà in "logico o/e senza cortocircuito". –

+0

Wow, davvero? È interessante e dovrò imparare di più su C#. Aggiornerò la risposta per indicare il tuo commento. – dustmachine

+0

Il commento di Mehrdad non è in realtà univoco per C# - molte (la maggior parte?) Lingue fortemente tipizzate hanno questa distinzione. So che è presente in Java e C++ e presumo sia presente in C, ad esempio. –

8

& e | sono operatori binari mentre || e & & sono booleani.

La grande differenza:
(1 & 2) è 0, falso
(1 & & 2) è vero

+3

(1 && 2) non è una sintassi C# valida. –

+4

La domanda originale non menzionava C#. È stato modificato dopo. – David

1

L'istanza in cui si sta utilizzando un singolo carattere (es | o &) è un confronto bit a bit dei risultati. Finché la tua lingua valuta queste espressioni su un valore binario, dovrebbero restituire gli stessi risultati. Come best practice, tuttavia, dovresti usare l'operatore logico poiché è ciò che intendi (penso).

3

(C Supponendo, C++, Java, JavaScript)

| e & sono operatori bit per bit, mentre || e && sono operatori logici. Solitamente vorresti usare || e && per le istruzioni if ​​e loop e simili (ad esempio per i tuoi esempi sopra). Gli operatori bit a bit servono per impostare e controllare i bit all'interno di maschere di bit.

28

& e | sono operatori bit a bit che possono operare su argomenti sia interi che booleani, e & & e || sono operatori logici che possono operare solo su argomenti booleani. In molte lingue, se entrambi gli argomenti sono booleani, la differenza fondamentale è che gli operatori logici eseguiranno una valutazione di cortocircuito e non valuteranno il secondo argomento se il primo argomento è sufficiente per determinare la risposta (ad es.nel caso di & &, se il primo argomento è falso, il secondo argomento è irrilevante).

+5

upvote per essere il primo a parlare del cortocircuito degli operatori booleani – David

0

Il & e | sono in genere operazioni bit a bit.

Dove come & & e || sono di solito operazioni logiche.

Per scopi di confronto, è perfettamente soddisfacente purché tutto ritorni un 1 o uno 0. In caso contrario, può restituire i falsi positivi. Dovresti evitare questo per prevenire errori di lettura.