2009-08-14 7 views
34

Duplicar posibles:
A clear, layman’s explanation of the difference between | and || in c# ?Diferencia entre | y || o & y && para la comparación

¿Cuál es la diferencia entre la comparación con | y || o & y & & en C# y Javascript?

Ejemplos:

if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2) 
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2) 
+0

¿qué idioma? –

+0

¿A qué idioma se refiere? –

+1

C# y javascript –

Respuesta

30

en C (y otros idiomas probablemente) una sola | o & es una comparación bit a bit.
El doble || o && es una comparación lógica.
Editar: Asegúrese de leer el comentario de Mehrdad a continuación con respecto a "sin cortocircuitos"

En la práctica, ya que true es a menudo equivalente a 1 y false es a menudo equivalente a 0, las comparaciones a nivel de bit a veces puede ser válido y devuelve exactamente el mismo resultado.

Hubo una vez un componente de software de misión crítica en el que ejecuté un analizador de código estático y señaló que se estaba utilizando una comparación bit a bit donde debería haber sido una comparación lógica. Dado que fue escrito en C y debido a la disposición de comparaciones lógicas, el software funcionó bien con cualquiera de los dos. Ejemplo:

if ((altitide > 10000) & (knots > 100)) 
... 
+22

en C# (que es un lenguaje fuertemente tipado,) utilizando | y & en variables booleanas dará como resultado "cortocircuito lógico y/o sin /". –

+0

Guau, ¿de verdad? Eso es interesante y tendré que aprender más sobre C#. Actualizaré la respuesta para señalar tu comentario. – dustmachine

+0

El comentario de Mehrdad en realidad no es exclusivo de C# - muchos (¿la mayoría?) Los lenguajes fuertemente tipados tienen esta distinción. Sé que está presente en Java y C++, y supongo que está presente en C, por ejemplo. –

8

& y | son operadores binarios mientras || y & & son booleanos.

La gran diferencia:
(1 & 2) es 0, falsa
(1 & & 2) es cierto

+3

(1 && 2) no es una sintaxis válida de C#. –

+4

La pregunta original no mencionaba C#. Fue editado después. – David

1

El caso en el que estás usando un solo carácter (es decir, | o &) es una comparación bit a bit de los resultados. Siempre que su idioma evalúe estas expresiones en un valor binario, deberían devolver los mismos resultados. Sin embargo, como una mejor práctica, debe usar el operador lógico ya que eso es lo que quiere decir (creo).

3

(Asumiendo C, C++, Java, JavaScript)

| y & son operadores de bits mientras || y && son operadores lógicos. Por lo general, le recomendamos usar || y && para las declaraciones y loops, y demás (es decir, para los ejemplos anteriores). Los operadores bit a bit son para configurar y verificar bits dentro de máscaras de bits.

28

& y | son operadores bit a bit que pueden operar tanto en números enteros como en argumentos booleanos, y & & y || son operadores lógicos que pueden operar solo con argumentos booleanos. En muchos idiomas, si ambos argumentos son booleanos, la diferencia clave es que los operadores lógicos realizarán una evaluación de cortocircuito y no evaluarán el segundo argumento si el primer argumento es suficiente para determinar la respuesta (p.en el caso de & &, si el primer argumento es falso, el segundo argumento es irrelevante).

+5

upvote por ser el primero en mencionar el cortocircuito de operadores booleanos – David

0

El & y | generalmente son operaciones bit a bit.

Donde como & & y || son generalmente operaciones lógicas.

Para fines de comparación, está perfectamente bien siempre que todo devuelva un 1 o un 0. De lo contrario, puede devolver falsos positivos. Sin embargo, debes evitar esto para evitar errores difíciles de leer.

Cuestiones relacionadas