C# condicional E ( & & ), OU (||) precedência
-
20-09-2019 - |
Pergunta
Entramos desnecessária a codificação de argumentos no meu trabalho, todo-o-tempo.Hoje eu perguntei se condicional E (&&) ou OU (||) tinha prioridade.Um dos meus colegas de trabalho insistiu que eles tinham a mesma precedência, que eu tinha dúvidas, então eu olhei para cima.
De acordo com MSDN E (&&) tem precedência maior do que OU (||).Mas, você pode provar isso para um cético colega de trabalho?
http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx
bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as
bool result = false || (true && false); // --> false
Então a minha pergunta é como você pode provar com o código que E (&&) tem maior precedência que OU (||)?Se a sua resposta for não importa, então por que é construído dessa forma na língua?
Solução
Mude o primeiro falso por verdadeiro. Eu sei que parece estúpido ter (verdadeiro || verdadeiro), mas isso prova o seu ponto.
bool result = true || true && false; // --> true
result = (true || true) && false; // --> false
result = true || (true && false); // --> true
Outras dicas
Se você realmente quer assustá -lo, tente:
bool result = True() | False() && False();
Console.WriteLine("-----");
Console.WriteLine(result);
static bool True()
{
Console.WriteLine(true);
return true;
}
static bool False()
{
Console.WriteLine(false);
return false;
}
Isso vai imprimir:
True
False
False
-----
False
Editar:
Em resposta ao comentário:
Em C#, |
é um operador lógico que executa a mesma lógica booleana que ||
, mas não faz curto-circuito. Também em C#, o |
O operador tem uma precedência maior do que ambos ||
e &&
.
Ao imprimir os valores, você pode ver que se eu usasse o típico ||
operador, apenas o primeiro True
seria impresso - seguido pelo resultado da expressão que teria sido True
também.
Mas por causa da maior precedência de |
, a true | false
é avaliado primeiro (resultando em true
) e então esse resultado é &&
ed com false
para ceder false
.
Eu não estava tentando mostrar a ordem de avaliação, apenas o fato de que a metade certa do |
foi avaliado período em que normalmente não seria :)
Isso não te daria o que você procura? Ou talvez eu esteja perdendo alguma coisa ...
bool result = true || false && false;
Você não prova isso com código, mas com lógica. E é multiplicação booleana, enquanto ou é adição booleana. Agora qual deles tem precedência mais alta?
Falso || verdade verdade
Rendimentos: Verdadeiro
false && true || verdadeiro
Rendimentos: Verdadeiro
Você não pode apenas mostrar o resultado final, quando o seu expressões booleanas estão sendo curto-circuito.Aqui está um trecho de código que resolve o seu caso.
Ele se baseia na implementação de & e | operadores utilizados pelo && e ||, conforme indicado no MSDN 7.11 Condicional operadores lógicos
public static void Test()
{
B t = new B(true);
B f = new B(false);
B result = f || t && f;
Console.WriteLine("-----");
Console.WriteLine(result);
}
public class B {
bool val;
public B(bool val) { this.val = val; }
public static bool operator true(B b) { return b.val; }
public static bool operator false(B b) { return !b.val; }
public static B operator &(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
return new B(lhs.val & rhs.val);
}
public static B operator |(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
return new B(lhs.val | rhs.val);
}
public override string ToString() {
return val.ToString();
}
}
A saída deve mostrar que && é avaliada antes de ||.
True & False
False | False
-----
False
Para mais diversão, tentar com resultado = t || t && f e ver o que acontece com curto-circuito.