Operadores lógicos booleanos - E, OU, NÃO, XOR
Os operadores booleanos lógicos executam operações lógicas com operandos bool . Os operadores incluem a negação lógica unária (!
), lógica binária AND (&
), OR (|
), e exclusiva OR (^
), e a lógica condicional binária AND (&&
) e OR (||
).
- Operador unário
!
(negação lógica). - Operadores binários
&
(lógico E),|
(lógico OR) e^
(lógico exclusivo OR). Esses operadores sempre avaliam ambos os operandos. - Operadores binários
&&
(AND lógico condicional) e||
(OR lógico condicional). Esses operadores avaliam o operando direito somente se for necessário.
Para operandos dos tipos numéricos integrais, os &
operadores , |
e ^
executam operações lógicas bitwise. Para obter mais informações, consulte Bitwise e operadores de turno.
Operador de negação lógica!
O operador de prefixo !
unário calcula a negação lógica de seu operando. Ou seja, produz true
, se o operando avalia a false
, e false
, se o operando avalia a true
:
bool passed = false;
Console.WriteLine(!passed); // output: True
Console.WriteLine(!true); // output: False
O operador postfix !
unário é o operador de perdão nulo.
Operador lógico AND &
O &
operador calcula o E lógico de seus operandos. O resultado de x & y
é true
se ambos x
e y
avaliar a true
. Caso contrário, o resultado é false
.
O &
operador sempre avalia ambos os operandos. Quando o operando esquerdo é avaliado como false
, o resultado da operação é false
independentemente do valor do operando direito. No entanto, mesmo assim, o operando direito é avaliado.
No exemplo a seguir, o operando direito do &
operador é uma chamada de método, que é executada independentemente do valor do operando esquerdo:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = false & SecondOperand();
Console.WriteLine(a);
// Output:
// Second operand is evaluated.
// False
bool b = true & SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
O operador &&
AND lógico condicional também calcula o AND lógico de seus operandos, mas não avalia o operando direito se o operando esquerdo for avaliado como false
.
Para operandos dos tipos numéricos integrais, o operador calcula &
a lógica bit a bit E de seus operandos. O operador unário &
é o endereço do operador.
Operador OR exclusivo lógico ^
O ^
operador calcula o OR lógico exclusivo, também conhecido como XOR lógico, de seus operandos. O resultado de x ^ y
é true
se x
avalia e y
true
avalia para false
, ou x
avalia para false
e y
avalia para true
. Caso contrário, o resultado é false
. Ou seja, para os bool
operandos, o ^
operador calcula o mesmo resultado que o operador !=
de desigualdade.
Console.WriteLine(true ^ true); // output: False
Console.WriteLine(true ^ false); // output: True
Console.WriteLine(false ^ true); // output: True
Console.WriteLine(false ^ false); // output: False
Para operandos dos tipos numéricos integrais, o operador calcula ^
o OR lógico exclusivo bit a bit de seus operandos.
Operador lógico OR |
O |
operador calcula o OR lógico de seus operandos. O resultado de x | y
é true
se um ou y
x
avalia a true
. Caso contrário, o resultado é false
.
O |
operador sempre avalia ambos os operandos. Quando o operando esquerdo é avaliado como true
, o resultado da operação é true
independentemente do valor do operando direito. No entanto, mesmo assim, o operando direito é avaliado.
No exemplo a seguir, o operando direito do |
operador é uma chamada de método, que é executada independentemente do valor do operando esquerdo:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = true | SecondOperand();
Console.WriteLine(a);
// Output:
// Second operand is evaluated.
// True
bool b = false | SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
O operador ||
OR lógico condicional também calcula o OR lógico de seus operandos, mas não avalia o operando direito se o operando esquerdo for avaliado como true
.
Para operandos dos tipos numéricos integrais, o operador calcula |
o OR lógico bit a bit de seus operandos.
Operador lógico condicional AND &&
O operador &&
lógico condicional AND , também conhecido como operador lógico AND de "curto-circuito", calcula o E lógico de seus operandos. O resultado de x && y
é true
se ambos x
e y
avaliar a true
. Caso contrário, o resultado é false
. Se x
avalia para false
, y
não é avaliado.
No exemplo a seguir, o operando direito do operador é uma chamada de &&
método, que não é executada se o operando esquerdo for avaliado como false
:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = false && SecondOperand();
Console.WriteLine(a);
// Output:
// False
bool b = true && SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
O operador lógico AND também calcula o AND &
lógico de seus operandos, mas sempre avalia ambos os operandos.
Operador OR lógico condicional ||
O operador ||
OR lógico condicional, também conhecido como operador OR lógico de "curto-circuito", calcula o OR lógico de seus operandos. O resultado de x || y
é true
se um ou y
x
avalia a true
. Caso contrário, o resultado é false
. Se x
avalia para true
, y
não é avaliado.
No exemplo a seguir, o operando direito do operador é uma chamada de ||
método, que não é executada se o operando esquerdo for avaliado como true
:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = true || SecondOperand();
Console.WriteLine(a);
// Output:
// True
bool b = false || SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
O operador |
OR lógico também calcula o OR lógico de seus operandos, mas sempre avalia ambos os operandos.
Operadores lógicos booleanos anuláveis
Para bool?
operandos, os &
operadores (lógico E) e |
(lógico OR) suportam a lógica de três valores da seguinte maneira:
O
&
operador produztrue
somente se ambos os seus operandos avaliarem atrue
. Se um oux
y
avalia parafalse
,x & y
produzfalse
(mesmo que outro operando avalie paranull
). Caso contrário, o resultado dex & y
énull
.O
|
operador produzfalse
somente se ambos os seus operandos avaliarem afalse
. Se um oux
y
avalia paratrue
,x | y
produztrue
(mesmo que outro operando avalie paranull
). Caso contrário, o resultado dex | y
énull
.
A tabela a seguir apresenta essa semântica:
x | S | x&y | x|y |
---|---|---|---|
verdadeiro | verdadeiro | verdadeiro | verdadeiro |
verdadeiro | false | false | verdadeiro |
verdadeiro | nulo | nulo | verdadeiro |
false | verdadeiro | false | verdadeiro |
false | false | false | false |
false | nulo | false | nulo |
nulo | verdadeiro | nulo | verdadeiro |
nulo | false | false | nulo |
nulo | nulo | nulo | nulo |
O comportamento desses operadores difere do comportamento típico do operador com tipos de valor anulável. Normalmente, um operador que é definido para operandos de um tipo de valor também pode ser usado com operandos do tipo de valor anulável correspondente. Esse operador produz null
se algum dos seus operandos for avaliado como null
. No entanto, os &
operadores e |
podem produzir não-nulo mesmo se um dos operandos for avaliado como null
. Para obter mais informações sobre o comportamento do operador com tipos de valor anuláveis, consulte a seção Operadores suspensos do artigo Tipos de valor anuláveis.
Você também pode usar os !
operadores e ^
com bool?
operandos, como mostra o exemplo a seguir:
bool? test = null;
Display(!test); // output: null
Display(test ^ false); // output: null
Display(test ^ null); // output: null
Display(true ^ null); // output: null
void Display(bool? b) => Console.WriteLine(b is null ? "null" : b.Value.ToString());
Os operadores &&
lógicos condicionais e ||
não suportam bool?
operandos.
Atribuição composta
Para um operador op
binário , uma expressão de atribuição composta do formulário
x op= y
é equivalente a
x = x op y
só que só é x
avaliado uma vez.
Os &
operadores , |
e ^
suportam atribuição composta, como mostra o exemplo a seguir:
bool test = true;
test &= false;
Console.WriteLine(test); // output: False
test |= true;
Console.WriteLine(test); // output: True
test ^= false;
Console.WriteLine(test); // output: True
Nota
Os operadores &&
lógicos condicionais e ||
não suportam atribuição composta.
Precedência dos operadores
A lista a seguir ordena os operadores lógicos a partir da maior precedência para a mais baixa:
- Operador de negação lógica
!
- Operador lógico E
&
- Operador lógico exclusivo das RUP
^
- Operador lógico OR
|
- Operador E lógico condicional
&&
- Operador OR lógico condicional
||
Use parênteses, ()
, para alterar a ordem de avaliação imposta pela precedência do operador:
Console.WriteLine(true | true & false); // output: True
Console.WriteLine((true | true) & false); // output: False
bool Operand(string name, bool value)
{
Console.WriteLine($"Operand {name} is evaluated.");
return value;
}
var byDefaultPrecedence = Operand("A", true) || Operand("B", true) && Operand("C", false);
Console.WriteLine(byDefaultPrecedence);
// Output:
// Operand A is evaluated.
// True
var changedOrder = (Operand("A", true) || Operand("B", true)) && Operand("C", false);
Console.WriteLine(changedOrder);
// Output:
// Operand A is evaluated.
// Operand C is evaluated.
// False
Para obter a lista completa de operadores C# ordenados por nível de precedência, consulte a seção Precedência do operador do artigo Operadores C#.
Capacidade de sobrecarga do operador
Um tipo definido pelo usuário pode sobrecarregar os !
operadores , &
, |
e ^
. Quando um operador binário está sobrecarregado, o operador de atribuição composto correspondente também é implicitamente sobrecarregado. Um tipo definido pelo usuário não pode sobrecarregar explicitamente um operador de atribuição composta.
Um tipo definido pelo usuário não pode sobrecarregar os operadores &&
lógicos condicionais e ||
. No entanto, se um tipo definido pelo usuário sobrecarregar os operadores true e false e o &
operador ou de |
uma determinada maneira, a &&
operação ou ||
, respectivamente, pode ser avaliada para os operandos desse tipo. Para obter mais informações, consulte a seção Operadores lógicos condicionais definidos pelo usuário da especificação da linguagem C#.
Especificação da linguagem C#
Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#: