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?

Foi útil?

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.

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