Pregunta

siempre he usado || (dos tubos) en expresiones OR, tanto en C# como en PHP.De vez en cuando veo que se usa una sola tubería: |.¿Cuál es la diferencia entre esos dos usos?¿Hay alguna advertencia al usar uno sobre el otro o son intercambiables?

¿Fue útil?

Solución

Al igual que el & y && operador, el operador doble es un operador de "cortocircuito".

Por ejemplo:

if(condition1 || condition2 || condition3)

Si la condición 1 es verdadera, NO se verificarán las condiciones 2 y 3.

if(condition1 | condition2 | condition3)

Esto verificará las condiciones 2 y 3, incluso si 1 ya es verdadera.Como sus condiciones pueden ser funciones bastante costosas, puede obtener un buen aumento de rendimiento al usarlas.

Hay una gran advertencia: NullReferences o problemas similares.Por ejemplo:

if(class != null && class.someVar < 20)

Si la clase es nula, la declaración if se detendrá después class != null Es falso.Si solo usa &, intentará verificar class.someVar y obtienes un lindo NullReferenceException.Con el operador Or, puede que eso no sea una gran trampa, ya que es poco probable que provoques algo malo, pero es algo a tener en cuenta.

Nadie usa nunca el single. & o | operadores, a menos que tenga un diseño donde cada condición sea una función que DEBE ejecutarse.Suena como un olor a diseño, pero a veces (raramente) es una forma limpia de hacer las cosas.El & El operador "ejecuta estas 3 funciones, y si una de ellas devuelve falso, ejecuta el bloque else", mientras que el | "solo ejecuta el bloque else si ninguno devuelve falso"; puede ser útil, pero como se dijo, a menudo es un olor a diseño.

Hay un segundo uso de la | y & operador sin embargo: Operaciones bit a bit.

Otros consejos

|| es el operador lógico OR.Parece que básicamente sabes qué es eso.Se utiliza en declaraciones condicionales como if, while, etc.

condition1 || condition2

Se evalúa como verdadero si la condición1 O la condición2 son verdaderas.

| es el operador OR bit a bit.Se utiliza para operar con dos números.Observa cada bit de cada número individualmente y, si uno de los bits es 1 en al menos uno de los números, entonces el bit resultante también será 1.Aquí están algunos ejemplos:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

Ojalá eso tenga sentido.

Entonces, para responder a las dos últimas preguntas, no diría que hay ninguna advertencia además de "conocer la diferencia entre los dos operadores". No son intercambiables porque hacen dos cosas completamente diferentes.

Uno es un "bit a bit o".

10011b | 01000b => 11011b

El otro es una lógica o.

verdadero o falso => ​​verdadero

Buena pregunta.Estos dos operadores funcionan igual en PHP y C#.

| es un OR bit a bit.Comparará dos valores por sus bits.P.ej.1101 | 0010 = 1111.Esto es extremadamente útil cuando se utilizan opciones de bits.P.ej.Lectura = 01 (0X01) Escritura = 10 (0X02) Lectura-Escritura = 11 (0X03).Un ejemplo útil sería abrir archivos.Un ejemplo sencillo sería:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

|| es un OR lógico.Esta es la forma en que la mayoría de la gente piensa en OR y compara dos valores en función de su verdad.P.ej.Voy a la tienda o iré al centro comercial.Este es el que se usa con más frecuencia en el código.P.ej.

if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer

Recurso PHP: http://us3.php.net/language.operators.bitwise

Recursos de C#: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

Ejemplo sencillo en 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;
  }
}

producción :

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

& - (Condición 1 y Condición 2):comprueba ambos casos incluso si el primero es falso

&& - (Condición 1 && Condición 2):No se molesta en comprobar el segundo caso si el caso uno es falso

&&: el operador hará que su código se ejecute más rápido, de manera profesional y rara vez se usa

| - (Condición 1 | Condición 2):comprueba ambos casos incluso si el caso 1 es verdadero

|| - (Condición 1 || Condición 2):No me molestes en comprobar el segundo caso si es el primero Una es verdadera

|| - El operador hará que su código se ejecute más rápido, profesionalmente | se usa raramente

El tubo único, |, es uno de los bit a bit operadores.

De Wikipedia:

En la familia de lenguajes de programación C, el operador OR bit a bit es "|" (tubería).Una vez más, este operador no debe confundirse con su contraparte booleana "o lógica", que trata sus operandos como valores booleanos y se escribe "||" (dos tubos).

Según su definición matemática, OR y AND son operadores binarios;verifican las condiciones LHS y RHS independientemente, de manera similar a | y &.

|| y && alteran las propiedades de los operadores OR y AND deteniéndolos cuando no se cumple la condición LHS.

El | realiza un OR bit a bit de sus dos operandos (lo que significa que ambos lados deben evaluarse como falso para que devuelva falso) mientras que el operador || solo evaluará al segundo operador si es necesario.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

La barra vertical "|" es el "bit a bit" o y solo debe usarse cuando sepa lo que está haciendo.La barra vertical doble "||" es un o lógico, y se puede usar en sentencias lógicas, como "x == 0 || x == 1".

A continuación se muestra un ejemplo de lo que hace bit a bit o:si a=0101 y b=0011, entonces a|b=0111.Si se trata de un sistema lógico que trata cualquier valor distinto de cero como verdadero, entonces el or bit a bit actuará de la misma manera que el or lógico, pero su contraparte (y bit a bit, "&") NO lo hará.Además, bit a bit o no realiza evaluación de cortocircuito.

Un solo tubo (|) es el operador bit a bit.

Dos tubos (||) es el operador O lógico.

No son intercambiables.

|| (dos tubos) suele ser un lógico o mientras | (un tubo) es un binario o.Fuera de mi cabeza, no puedo pensar en ningún momento en que la diferencia sea un gran problema (aparte de cuando estás asignando el resultado a otra cosa).Sin embargo, estoy seguro de que alguien más tendrá una situación en la que sea importante.

Editar:Vaya, otras seis respuestas en el tiempo que me llevó escribir esto.

Bit a bit (|) vs.lógico(||)!Piense en lo lógico como los objetos comparables en Java, comparando algunas "partes" distinguibles mientras el operador bit a bit mira estos objetos y en lugar de ver si son visualmente gemelos (como lo hace el lógico), toma una muestra de ADN y mira los 0 y 1. en cambio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top