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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top