c# - operator - ¿Cuál es la diferencia entre el | y || o los operadores?
operator c# (13)
Siempre he usado ||
(dos tubos) en expresiones OR, tanto en C # como en PHP. De vez en cuando veo un solo tubo utilizado: |
. ¿Cuál es la diferencia entre esos dos usos? ¿Hay alguna advertencia al usar una sobre la otra o son intercambiables?
& - (Condición 1 y Condición 2): comprueba ambos casos incluso si el primero es falso
&& - (Condición 1 && Condición 2): no se moleste en verificar el segundo caso si el caso uno es falso
&& - el operador hará que su código se ejecute más rápido, profesionalmente y rara vez se use
| - (Condición 1 | Condición 2): verifica ambos casos incluso si el caso 1 es verdadero
|| - (Condición 1 || Condición 2): no se moleste en verificar el segundo caso si el primero es verdadero
|| - el operador hará que su código se ejecute más rápido, profesionalmente | rara vez se utiliza
Al igual que el operador &
&&
, el operador doble es un operador de "cortocircuito".
Por ejemplo:
if(condition1 || condition2 || condition3)
Si la condición 1 es verdadera, las condiciones 2 y 3 NO serán verificadas.
if(condition1 | condition2 | condition3)
Esto comprobará las condiciones 2 y 3, incluso si 1 ya es verdadero. Como sus condiciones pueden ser funciones bastante caras, 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 instrucción if se detendrá después de que class != null
sea falso. Si solo usa &, intentará verificar class.someVar
y obtendrá una bonita NullReferenceException
. Con el Or-Operator eso puede no ser una trampa, ya que es poco probable que desencadenes algo malo, pero es algo que debes tener en cuenta.
Nadie usa el single &
o |
sin embargo, los operadores, a menos que tenga un diseño en el que cada condición sea una función que DEBE ejecutarse. Suena como un olor a diseño, pero a veces (rara vez) es una forma limpia de hacer cosas. 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 bitwise .
Bitwise (|) vs. lógico (||)! Piense en los objetos lógicos como los comparables en Java, comparando algunas "partes" distinguibles mientras que el operador bitwise mira estos objetos y en lugar de ver si son gemelos visuales (como hace lógico), toma una muestra de ADN y mira los 0 y los 1 en lugar.
Buena pregunta. Estos dos operadores funcionan de la misma manera en PHP y C #.
| es un OR a modo de bit. Se compararán dos valores por sus bits. Ej. 1101 | 0010 = 1111. Esto es extremadamente útil cuando se usan opciones de bits. Ej .: Lectura = 01 (0X01) Escritura = 10 (0X02) Lectura-Escritura = 11 (0X03). Un ejemplo útil sería abrir archivos. Un ejemplo simple 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 las personas piensa en OR y compara dos valores basados en su verdad. Por ejemplo, voy a la tienda o iré al centro comercial. Este es el que más se usa en el código. P.ej
if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer
Recurso de 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 simple 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;
}
}
salida:
using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
El único tubo, |, es uno de los operadores bitwise .
De Wikipedia:
En la familia de lenguajes de programación C, el operador OR a nivel de bits es "|" (tubo). Nuevamente, este operador no debe confundirse con su contraparte "lógica o" booleana, que trata sus operandos como valores booleanos, y se escribe "||" (dos tubos).
El tubo singe "|" es el "bitwise" o y solo debe usarse cuando sabes lo que estás haciendo. El tubo doble "||" es un lógico o, y se puede usar en declaraciones lógicas, como "x == 0 || x == 1".
Aquí hay un ejemplo de lo que hace bitwise o lo hace: si a = 0101 y b = 0011, entonces a | b = 0111. Si está tratando con un sistema lógico que trata cualquier no cero como verdadero, entonces el bit a bit o actuará de la misma manera que el lógico o, pero es equivalente (bitwise y, "&") NO. También el bitwise o no realiza evaluación de cortocircuito.
El | el operador realiza un OR a nivel de bits de sus dos operandos (lo que significa que ambos lados deben evaluar a falso para que devuelva falso) mientras que el || El operador solo evaluará al segundo operador si lo necesita.
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
Por su definición matemática, OR y AND son operadores binarios; Verifican las condiciones de LHS y RHS independientemente, de manera similar a | y &.
|| y && altere las propiedades de los operadores OR y AND deteniéndolos cuando no se cumple la condición LHS.
Un solo tubo (|) es el operador OR a nivel de bits .
Dos tuberías (||) es el operador OR lógico.
No son intercambiables.
Uno es un "bitwise o".
10011b | 01000b => 11011b
El otro es una lógica o.
verdadero o falso => verdadero
|| (Dos tubos) suele ser un lógico o mientras | (un tubo) es un binario o. Desde lo alto de mi cabeza, no puedo pensar en ningún momento en que la diferencia sea una gran sorpresa (aparte de cuando asignas el resultado a otra cosa). Sin embargo, estoy seguro de que alguien más tendrá una situación en la que importa.
Edit: Wow, otras seis respuestas en el tiempo que me tomó escribir esto.
|| es el operador OR lógico. Parece que básicamente sabes lo que es eso. Se usa en sentencias condicionales como if, while, etc.
condition1 || condition2
Se evalúa como verdadero si la condición1 O la condición2 es verdadera.
| es el operador OR a nivel de bit. Se utiliza para operar en dos números. Miras cada bit de cada número individualmente y, si uno de los bits es 1 en al menos uno de los números, 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
Esperemos que tenga sentido.
Entonces, para responder a las dos últimas preguntas, no diría que hay otras advertencias además de "saber la diferencia entre los dos operadores". No son intercambiables porque hacen dos cosas completamente diferentes.