2013-03-21 16 views
6

Esiste una differenza funzionale tra operatori logici e bit a bit nel seguente codice? Quali sono i motivi per usare l'uno o l'altro?Operatori OR bit a bit e OR logici. Qual è la differenza?

typedef unsigned char BOOLEAN; 

void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo) 
{ 
    BOOLEAN bLogicalOr = (bFoo || bBar); 
    BOOLEAN bBitwiseOr = (bFoo | bBar); 

    ... 
} 
+4

Se 'bBar' è vero, la variabile' bFoo' non è nemmeno accessibile .... –

+0

si verifica un cortocircuito solo per l'operatore logcial? – Pablitorun

+0

grazie a tutti, non avevo pensato a cortocircuiti, ma questa è esattamente la risposta che stavo cercando. – Pablitorun

risposta

9

Che cosa significa "supporto"?

Se è logico o che vuoi dire, allora ovviamente devi sempre usare || dato che è l'operatore booleano logico "o".

Ha il vantaggio di essere in grado di cortocircuitare, ma non importa molto nel codice questo semplice.

Lo considererei strano e strano (e dovuto correggere) se è stato utilizzato bit per bit o quando il punto non è quello di manipolare i bit.

+0

in questo caso indica se creare o meno una puzza in una revisione del codice. :) Sono d'accordo con te, ho posto la domanda qui per vedere se c'erano altri motivi oltre a quello strano e strano (che è). – Pablitorun

+0

Suggerirei di fare questa domanda (e le risposte) un membro di [C-faq] (http://stackoverflow.com/questions/tagged/c-faq). Ti dispiacerebbe ripulire la risposta un po '? – ulidtko

7

Il booleano || cortocircuito: se il primo operando è true, il secondo non verrà mai valutato. Al contrario, il bitwise | valuta sempre entrambi gli argomenti.

+0

ma non avrebbe importanza dal momento che entrambi gli argomenti sono semplici semplici caratteri senza segno – ITroubs

+0

Mentre questo è vero, non si noterà alcuna differenza a livello di codice macchina. Qualsiasi compilatore semi-decente lo valuterà nello stesso codice macchina. Il supporto – Lundin

1

L'operatore a bit o l'operatore non cortocircuiti mai mentre quello logico. Cioè se bFoo è vero, bBar non viene mai valutato.

7

Altre risposte hanno già parlato di cortocircuito (ma questo non è un problema nel vostro particolare codice). Ma qui c'è una differenza fondamentale.

Se, per qualche motivo, i valori di input non sono in [0,1], allora un OR bit a bit ti darà una risposta che potrebbe anche non essere in [0,1]. Logico OR è garantito per darti 0 o 1.

Per questo motivo, si dovrebbe preferire OR logico. Il tuo intento è (presumibilmente) di manipolare i valori logici, quindi usare un operatore non logico è illogico. *


* Pun sicuramente destinato.

2

In questo caso particolare, non, non v'è alcuna differenza nel risultato :

1 || 0 == 1 
1 | 0 == 1 

tutte le tabelle di verità applicano qui.

Se stai parlando di come siamo arrivati ​​ al risultato poi ci potrebbe essere una differenza. Con la || si ha un breve meccanismo di circuito:

BOOLEAN bFooBar = (bFoo||bBar) // if bFoo is TRUE, we never look at bBar 
           // vs 
BOOLEAN bFooBar = (bFoo|bBar) // where we take into account both values 

Così il lungo e breve di esso è, sì, è possibile utilizzare gli operatori logici e bit a bit in modo non corretto in alcuni casi e ottenere gli stessi risultati, ma perché si sempre farlo? Se sai che è sbagliato, e sai che può portare a cattivi, difficili da trovare bug, usa gli strumenti che il linguaggio ti ha dato per i lavori che dovevano fare.

+0

'(a || b)' è ** true ** nello snippet di codice ... –

1

C'è qualche differenza funzionale tra gli operatori logici e bit a bit nel seguente caso?

Sì, c'è (eval pigro come altri hanno sottolineato).

Qualsiasi motivo per supportare uno o l'altro?

Se in qualche modo fossero equivalenti, il caso di utilizzare operatori logici sarebbe quello di preservare la semantica intesa dal tipo. Vedi anche: Principle of least astonishment.

Problemi correlati