Qual é a diferença entre o | e || ou operadores?
Pergunta
Eu sempre usei ||
(dois pipes) em expressões OR, tanto em C# quanto em PHP.Ocasionalmente vejo um único tubo usado: |
.Qual é a diferença entre esses dois usos?Há alguma advertência ao usar um em vez do outro ou eles são intercambiáveis?
Solução
Assim como o &
e &&
operador, o operador duplo é um operador de "curto-circuito".
Por exemplo:
if(condition1 || condition2 || condition3)
Se a condição1 for verdadeira, as condições 2 e 3 NÃO serão verificadas.
if(condition1 | condition2 | condition3)
Isto irá verificar as condições 2 e 3, mesmo que 1 já seja verdadeira.Como suas condições podem ser funções bastante caras, você pode obter um bom aumento de desempenho usando-as.
Há uma grande ressalva: NullReferences ou problemas semelhantes.Por exemplo:
if(class != null && class.someVar < 20)
Se a classe for nula, a instrução if irá parar após class != null
é falso.Se você usar apenas &, ele tentará verificar class.someVar
e você ganha um belo NullReferenceException
.Com o Or-Operator isso pode não ser uma armadilha, pois é improvável que você desencadeie algo ruim, mas é algo para se manter em mente.
Ninguém nunca usa o single &
ou |
operadores, a menos que você tenha um design em que cada condição seja uma função que TEM que ser executada.Parece um cheiro de design, mas às vezes (raramente) é uma maneira limpa de fazer as coisas.O &
operador "executa essas 3 funções, e se uma delas retornar falso, executa o bloco else", enquanto o |
"só executa o bloco else se nenhum retornar falso" - pode ser útil, mas como foi dito, geralmente é um cheiro de design.
Há um segundo uso do |
e &
operador embora: Operações bit a bit.
Outras dicas
|| é o lógico ou operador.Parece que você basicamente sabe o que é isso.É usado em declarações condicionais como if, while, etc.
condition1 || condition2
Avalia como verdadeiro se condição1 OU condição2 for verdadeira.
| é o bit netwise ou o operador.É usado para operar em dois números.Você olha cada bit de cada número individualmente e, se um dos bits for 1 em pelo menos um dos números, o bit resultante também será 1.Aqui estão alguns exemplos:
A = 01010101
B = 10101010
A | B = 11111111
A = 00000001
B = 00010000
A | B = 00010001
A = 10001011
B = 00101100
A | B = 10101111
Espero que isso faça sentido.
Então, para responder às duas últimas perguntas, eu não diria que há advertências além de "saber a diferença entre os dois operadores". Eles não são intercambiáveis porque fazem duas coisas completamente diferentes.
Um é um "ou bit a bit".
10011b | 01000b => 11011b
O outro é uma lógica ou.
verdadeiro ou falso => verdadeiro
Boa pergunta.Esses dois operadores funcionam da mesma forma em PHP e C#.
| é um pouco bit ou.Ele comparará dois valores por seus bits.Por exemplo.1101 | 0010 = 1111.Isto é extremamente útil ao usar opções de bits.Por exemplo.Leitura = 01 (0X01) Gravação = 10 (0X02) Leitura-Escrita = 11 (0X03).Um exemplo útil seria abrir arquivos.Um exemplo simples seria:
File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file
|| é um lógico ou.Esta é a forma como a maioria das pessoas pensa em OR e compara dois valores com base na sua verdade.Por exemplo.Vou à loja ou ao shopping.Este é o usado com mais frequência no código.Por exemplo.
if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer
Recurso PHP: http://us3.php.net/linguagem.operators.bitwise
Recursos C#: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
Exemplo simples em 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;
}
}
saída :
using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
& - (Condição 1 e Condição 2):verifica ambos os casos mesmo que o primeiro seja falso
&& - (Condição 1 && Condição 2):Não se preocupe em verificar o segundo caso se o caso um for falso
&& - o operador fará seu código rodar mais rápido, profissionalmente e raramente é usado
| - (Condição 1 | Condição 2):verifica ambos os casos mesmo que o caso 1 seja verdadeiro
|| - (Condição 1 || Condição 2):Não se preocupe em verificar o segundo caso se primeiro for verdadeiro
|| - O operador tornará seu código funcionar mais rápido, profissionalmente | raramente é usado
O tubo único, |, é um dos bit a bit operadores.
Da Wikipédia:
Na família de linguagem de programação C, o Bitwise ou o operador é "|" (cano).Novamente, esse operador não deve ser confundido com seu cooleano "ou" contraparte, que trata seus operando como valores booleanos e está escrito "||" (dois tubos).
Pela sua definição matemática, OR e AND são operadores binários;Eles verificam as condições LHS e RHS, independentemente, da mesma forma que | e &.
|| e && alteram as propriedades dos operadores da OR e e interrompem quando a condição do LHS não for cumprida.
O | O operador executa um desempenho bit bit ou de seus dois operandos (o que significa que ambos os lados devem avaliar como false para que ele retorne falsa) enquanto o || O operador avaliará apenas o segundo operador, se necessário.
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
O cano de Singe "|" é o "bit" ou só deve ser usado quando você sabe o que está fazendo.O tubo duplo "||" é um ou lógico e pode ser usado em declarações lógicas, como "x == 0 || x == 1".
Aqui está um exemplo do que o bit a bit ou faz:se a=0101 e b=0011, então a|b=0111.Se você estiver lidando com um sistema lógico que trata qualquer valor diferente de zero como verdadeiro, então o ou bit a bit agirá da mesma maneira que o ou lógico, mas sua contraparte (bit a bit e, "&") NÃO funcionará.Além disso, o bit a bit ou não realiza avaliação de curto-circuito.
Um único tubo (|) é o operador OR bit a bit.
Duas barras verticais (||) é o operador lógico OR.
Eles não são intercambiáveis.
|| (dois tubos) é geralmente um lógico ou enquanto | (um tubo) é um binário ou.Pensando bem, não consigo pensar em nenhum momento em que a diferença seria uma grande pegadinha (exceto quando você está atribuindo o resultado a outra coisa).No entanto, tenho certeza de que outra pessoa terá uma situação em que isso seja importante.
Editar:Uau, seis outras respostas no tempo que levei para escrever isso.
Bit a bit (|) vs.lógico(||)!Pense em lógico como os objetos Comparáveis em Java, comparando algumas "partes" distinguíveis enquanto o operador bit a bit olha para esses objetos e em vez de ver se eles são visualmente gêmeos (como faz o lógico), faz uma amostra de DNA e olha para os 0's e 1's em vez de.