Respostas:
Estou um pouco confuso com a documentação MSDN C #, que afirma que
&
e|
são operadores lógicos e que&&
e||
são operadores condicionais. Eu continuo ligando&&
,||
e!
operadores lógicos, então estou errado?
Não; você está certo.
Existem inúmeros erros de nomenclatura pequenos, principalmente sem importância, na documentação do MSDN; Tentei divulgar o maior número possível deles, mas nos casos em que não é flagrantemente errado e enganoso, nem sempre é um uso sábio do tempo. Vá para a especificação se desejar uma declaração definitiva sobre o nome de um recurso C #.
Portanto: a autoridade relevante é a especificação C #, que afirma na seção 7.11:
A
&
,^
, e|
os operadores são chamados os operadores lógicos.
Em seguida, ele divide ainda mais os operadores lógicos internos em operadores lógicos inteiro, enumeração, booleano e booleano anulável. Também existem operadores lógicos definidos pelo usuário; veja a especificação para detalhes.
Na seção 7.12, temos
Os operadores
&&
e||
são chamados de operadores lógicos condicionais. Eles também são chamados de operadores lógicos de "curto-circuito".
Então, todos eles são operadores lógicos . Alguns deles são operadores lógicos condicionais .
O que torna os operadores lógicos condicionais condicionais ? Pode-se fazer um palpite ilusório de que isso ocorre porque eles geralmente são usados em declarações condicionais ( if
) ou expressões condicionais ( ? :
). A verdadeira razão é dada pela especificação:
Os operadores
&&
e||
são versões condicionais dos operadores&
e|
: A operaçãox && y
corresponde à operaçãox & y
, exceto quey
é avaliada apenas sex
não for falsa. A operaçãox || y
corresponde à operaçãox | y
, exceto quey
é avaliada apenas sex
não for verdadeira.
Os operadores lógicos condicionais são assim nomeados porque o operando do lado direito é avaliado condicionalmente, dependendo do valor do operando do lado esquerdo.
Podemos ver isso mais claramente 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 realmente expressões condicionais.
Há também uma forma definida pelo usuário do operador lógico condicional, e é um pouco complicado. Veja a especificação para detalhes.
Leitura adicional, se este assunto lhe interessar:
Em C #, todos esses são operadores lógicos.
int x = 0xABCD & 0xFF // x == 0xCD
&&
e ||
são chamados de " operadores lógicos condicionais " porque estão em curto-circuito.
bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated,
// because x == 0xEF is false
Observe que essa terminologia difere 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 ++ classifica-los como operadores aritméticos .
O ponto é que &
e |
são operadores bit a bit , o que significa que eles são aplicados e produzem valores de cadeia de bits. E bit a bit é um termo muito usado entre programadores.
Por exemplo 0xff & 0x00 == 0x00
, enquanto 0xff | 0x00 == 0xff
.
E &&
e ||
são aplicados a condições, e deu os valores habituais de condições; ie true
e false
.
Por exemplo true && false == false
, enquanto true || false == true
.
Por isso &&
e ||
poderia ser chamado condicionais operadores, apesar de que não é um termo usual entre os programadores.
Obviamente, todo programador de C, C ++, Java e C # sabe tudo isso. Mas acho que o mal-entendido acontece porque "operador condicional" não é um termo usado com freqüência por nós programadores.
|
seja intercambiável||
, mesmo que em muitos casos eles possam ser trocados sem nenhuma mudança aparente no comportamento do programa.