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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top