Qual è la differenza tra il | e || o operatori?
Domanda
Ho sempre usato ||
(due pipe) nelle espressioni OR, sia in C# che in PHP.Occasionalmente vedo una singola pipa utilizzata: |
.Qual è la differenza tra questi due usi?Ci sono delle avvertenze quando si usa l'uno rispetto all'altro o sono intercambiabili?
Soluzione
Proprio come il &
E &&
operatore, il doppio Operatore è un operatore di "cortocircuito".
Per esempio:
if(condition1 || condition2 || condition3)
Se la condizione 1 è vera, le condizioni 2 e 3 NON verranno verificate.
if(condition1 | condition2 | condition3)
Ciò verificherà le condizioni 2 e 3, anche se 1 è già vera.Poiché le condizioni possono essere funzioni piuttosto costose, è possibile ottenere un buon incremento delle prestazioni utilizzandole.
C'è un grosso avvertimento, NullReferences o problemi simili.Per esempio:
if(class != null && class.someVar < 20)
Se la classe è nulla, l'istruzione if si fermerà dopo class != null
è falso.Se usi solo &, proverà a controllare class.someVar
e ottieni un bel risultato NullReferenceException
.Con l'operatore Or questa potrebbe non essere una trappola poiché è improbabile che si inneschi qualcosa di brutto, ma è qualcosa da tenere a mente.
Nessuno usa mai il singolo &
O |
operatori però, a meno che tu non abbia un progetto in cui ogni condizione è una funzione che DEVE essere eseguita.Sembra un odore di design, ma a volte (raramente) è un modo pulito di fare le cose.IL &
l'operatore "esegue queste 3 funzioni e, se una di esse restituisce false, esegue il blocco else", mentre l'operatore |
fa "eseguire il blocco else solo se nessuno restituisce false" - può essere utile, ma come detto, spesso è un odore di design.
C'è un secondo utilizzo di |
E &
operatore però: Operazioni bit a bit.
Altri suggerimenti
|| è il logico o l'operatore.Sembra che tu sappia praticamente di cosa si tratta.Viene utilizzato nelle istruzioni condizionali come if, while, ecc.
condition1 || condition2
Restituisce vero se sia la condizione1 che la condizione2 sono vere.
| è il bitwise o l'operatore.Serve per operare su due numeri.Guardi ogni bit di ciascun numero individualmente e, se uno dei bit è 1 in almeno uno dei numeri, anche il bit risultante sarà 1.Ecco alcuni esempi:
A = 01010101
B = 10101010
A | B = 11111111
A = 00000001
B = 00010000
A | B = 00010001
A = 10001011
B = 00101100
A | B = 10101111
Speriamo che abbia senso.
Quindi, per rispondere alle ultime due domande, non direi che ci sono avvertimenti oltre a "conoscere la differenza tra i due operatori". Non sono intercambiabili perché fanno due cose completamente diverse.
Uno è un "bit a bit o".
10011b | 01000b => 11011b
L'altro è una logica o.
vero o falso => vero
Buona domanda.Questi due operatori funzionano allo stesso modo in PHP e C#.
| è un po 'o.Confronterà due valori in base ai loro bit.Per esempio.1101 | 0010 = 1111.Ciò è estremamente utile quando si utilizzano le opzioni bit.Per esempio.Lettura = 01 (0X01) Scrittura = 10 (0X02) Lettura-Scrittura = 11 (0X03).Un esempio utile potrebbe essere l'apertura di file.Un semplice esempio potrebbe essere:
File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file
|| è un logico o.Questo è il modo in cui la maggior parte delle persone pensa all'OR e confronta due valori in base alla loro verità.Per esempio.Vado al negozio o andrò al centro commerciale.Questo è quello utilizzato più spesso nel codice.Per esempio.
if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer
Risorsa PHP: http://us3.php.net/lingual.operators.bitwise
Risorse C#: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
Semplice esempio in Java
public class Driver {
static int x;
static int y;
public static void main(String[] args)
throws Exception {
System.out.println("using double pipe");
if(setX() || setY())
{System.out.println("x = "+x);
System.out.println("y = "+y);
}
System.out.println("using single pipe");
if(setX() | setY())
{System.out.println("x = "+x);
System.out.println("y = "+y);
}
}
static boolean setX(){
x=5;
return true;
}
static boolean setY(){
y=5;
return true;
}
}
produzione :
using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
& - (Condizione 1 e Condizione 2):controlla entrambi i casi anche se il primo è falso
&& - (Condizione 1 && Condizione 2):non preoccuparti di controllare il secondo caso se il caso uno è falso
&& - l'operatore renderà il tuo codice più veloce, professionale e viene utilizzato raramente
| - (Condizione 1 | Condizione 2):controlla entrambi i casi anche se il caso 1 è vero
|| - (condizione 1 || condizione 2):non preoccuparti di controllare il secondo caso se il primo è vero
|| - L'operatore farà funzionare il codice più veloce, professionalmente | viene usato raramente
La pipe singola, |, è una delle bit per bit operatori.
Da Wikipedia:
Nella famiglia di lingua di programmazione C, il bit o l'operatore è "|" (tubo).Ancora una volta, questo operatore non deve essere confuso con la sua controparte booleana "logica o", che tratta i suoi operandi come valori booleani ed è scritto "||" (due tubi).
Per definizione matematica, OR e AND sono operatori binari;Verificano le condizioni di LHS e RHS indipendentemente, allo stesso modo a | E &.
|| e && alterare le proprietà di OR e e degli operatori fermandole quando la condizione LHS non è soddisfatta.
Il | L'operatore si comporta un po 'o dei suoi due operandi (il che significa che entrambe le parti devono valutare false per restituire false) mentre il || L'operatore valuterà il secondo operatore solo se necessario.
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
The Singe Pipe "|" è "bitwise" o dovrebbe essere usato solo quando sai cosa stai facendo.Il doppio tubo "||" è logico o e può essere usato in istruzioni logiche, come "x == 0 || x == 1".
Ecco un esempio di ciò che fa bit a bit o:se a=0101 e b=0011, allora a|b=0111.Se hai a che fare con un sistema logico che tratta qualsiasi valore diverso da zero come vero, allora l'or bit a bit agirà allo stesso modo dell'or logico, ma la sua controparte (bit a bit e "&") NON lo farà.Anche il bit a bit o non esegue la valutazione del cortocircuito.
Una pipe singola (|) è il operatore OR bit per bit.
Due pipe (||) sono l'operatore logico OR.
Non sono intercambiabili.
|| (due tubi) è di solito a logico o while | (un tubo) è un binario O.A pensarci bene, non riesco a pensare a nessun momento in cui la differenza sarebbe un grosso problema (a parte quando assegni il risultato a qualcos'altro).Tuttavia sono sicuro che qualcun altro avrà una situazione in cui è importante.
Modificare:Wow, altre sei risposte nel tempo che mi ci è voluto per scrivere questo.
Bit a bit (|) vs.logico(||)!Pensa alla logica come agli oggetti comparabili in Java, confrontando alcune "parti" distinguibili mentre l'operatore bit a bit guarda questi oggetti e invece di vedere se sono visivamente gemelli (come fa la logica), fa un campione di DNA e guarda gli 0 e gli 1 Invece.