operator c# php operators

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.



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.



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.