&& e || não são operadores lógicos, mas condicionais?

61

Estou um pouco confuso com a documentação do MSDN C #, que afirma que & , | são operadores lógicos e && e || são operadores condicionais.

Eu continuo chamando os operadores && , || , ! logical, então estou errado?

    
por John V 22.11.2017 / 18:14
fonte

3 respostas

118

I am a bit confused by the MSDN C# documentation which states that &,| are logical operators and && and || are conditional operators. I keep calling &&, ||, ! logical operators, so I am wrong?

Não; você está correto.

Existem inúmeros pequenos erros de nomenclatura, principalmente sem importância, na documentação do MSDN; Tentei tirar o maior número possível deles, mas, nos casos em que isso não é notoriamente errado e enganoso, nem sempre é um uso inteligente do tempo. Vá para a especificação se você quiser uma declaração definitiva sobre o nome de um recurso C #.

Então: a autoridade relevante é a especificação C #, que afirma na seção 7.11:

The &, ^, and | operators are called the logical operators.

Em seguida, ele continua a dividir ainda mais os operadores lógicos internos em operadores lógicos integer, enumeration, Boolean e nullable-Boolean. Existem também operadores lógicos definidos pelo usuário; veja a especificação para detalhes.

Na seção 7.12 nós temos

The && and || operators are called the conditional logical operators. They are also called the “short-circuiting” logical operators.

Então, todos eles são operadores lógicos . Alguns deles são operadores lógicos condicionais .

O que torna os condutores lógicos condicionais condicionais ? Alguém pode adivinhar que é porque eles são tipicamente usados em declarações condicionais ( if ) ou expressões condicionais ( ? : ). A verdadeira razão é dada pela especificação:

The && and || operators are conditional versions of the & and | operators: The operation x && y corresponds to the operation x & y, except that y is evaluated only if x is not false. The operation x || y corresponds to the operation x | y, except that y is evaluated only if x is not true.

Os operadores lógicos condicionais são assim nomeados porque o operando da mão direita é avaliado condicionalmente dependendo do valor do operando da esquerda.

Podemos ver isso de forma mais vívida, observando que os operadores lógicos condicionais são apenas "açúcares sintáticos" para expressões condicionais . x && y é simplesmente uma maneira mais agradável de escrever x ? y : false e x || y é simplesmente uma maneira mais agradável de escrever x ? true : y . As expressões lógicas condicionais são, na verdade, expressões condicionais.

Existe também uma forma definida pelo usuário do operador lógico condicional, e é um pouco complicado. Veja a especificação para detalhes.

Mais leituras, se este assunto lhe interessar:

por 22.11.2017 / 18:55
fonte
26

Em C #, estes são todos operadores lógicos.

int x = 0xABCD & 0xFF // x == 0xCD

&& e || são chamados de "operadores lógicos condicionais " porque são curtos-circuitos.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Observe que essa terminologia é diferente de idioma para idioma. Em C e C ++ && e || são apenas Operadores lógicos. Em Java, & e | são chamados de Operadores bit a bit , enquanto C e C ++ os classificam como Operadores aritméticos .

    
por 22.11.2017 / 18:18
fonte
-3

O ponto é que & e | são operadores bit a bit , o que significa que eles são aplicados e geram valores de sequência de bits. E bitwise é um termo muito usado entre programadores.

Por exemplo, 0xff & 0x00 == 0x00 , enquanto 0xff | 0x00 == 0xff .

E && e || são aplicados às condições e produzem os valores usuais das condições; ou seja, true e false .

Por exemplo, true && false == false , enquanto true || false == true .

Portanto, && e || poderiam ser chamados de operadores condicionais , embora esse não seja um termo comum entre os programadores.

Naturalmente, todos os programadores C, C ++, Java e C # sabem disso. Mas eu acho que o mal entendido acontece porque "operador condicional" não é um termo freqüentemente usado por nós programadores.

    
por 24.11.2017 / 01:18
fonte