Este é o único lugar que eu já vi and
, or
e not
listado como operadores reais em C ++. Quando escrevi um programa de teste no NetBeans, recebi o sublinhado vermelho como se houvesse um erro de sintaxe e percebi que o site estava errado, mas é o NetBeans que está errado porque compilou e rodou conforme o esperado.
Posso ver que !
estão sendo favorecidos, not
mas a legibilidade de and
&& or
parece maior do que seus irmãos gramaticais. Por que essas versões dos operadores lógicos existem e por que aparentemente ninguém as usa? Isso é C ++ realmente válido ou algum tipo de compatibilidade com C que foi incluído com a linguagem?
c++
language-features
logical-operators
defeituoso
fonte
fonte
||
e&&
, talvez até!
às vezes. Palavras são sempre melhores do que "ruído de linha", sem falar na possível confusão com os operadores de manipulação de bits.and
é mais legível e depois escrever "and
&&or
" embora :)Respostas:
Eles se originaram em C no cabeçalho
<iso646.h>
. Na época, havia teclados que não podiam digitar os símbolos necessários para&&
(por exemplo), então o cabeçalho continha#define
's que os ajudaria a fazer isso, por (em nosso exemplo) definirand
ser&&
. Claro, com o passar do tempo, isso foi se tornando menos usado.Em C ++, eles se tornaram o que é conhecido como tokens alternativos . Você não precisa incluir nada para usar esses tokens em um compilador compatível (como tal, a versão C ++ ified do cabeçalho C,,
<ciso646>
está em branco). Os tokens alternativos são iguais aos tokens regulares, exceto pela ortografia. Portanto, durante a análiseand
é exatamente o mesmo que&&
, é apenas uma maneira diferente de escrever a mesma coisa.Quanto ao seu uso: como raramente são usados, usá-los costuma ser mais surpreendente e confuso do que útil. Tenho certeza de que se fosse normal, eles seriam muito mais fáceis de ler, mas as pessoas estão tão acostumadas
&&
e||
qualquer outra coisa se distrai.EDIT: No entanto, vi um ligeiro aumento no uso deles desde que postei isso. Eu ainda os evito.
fonte
or
ounot
sem incluir o cabeçalho.Eles existem para usabilidade (suporte a caracteres em tipos de teclado / tela) e legibilidade geral, mas há outra razão que é hoje em dia mais pronunciada. Quase nenhuma das respostas aqui , aqui , ou mesmo a resposta principal aquiexplique a razão principal pela qual muitos de nós preferimos as versões das palavras em vez das versões dos símbolos (e uma das principais razões pelas quais outras línguas as usam): bugs. As diferenças entre as versões das palavras são muito visíveis. As diferenças entre as versões dos símbolos são bem menores, a ponto de causar bugs em uma extensão comparativamente muito maior: "x | y" não é muito "x || y", mas quando embutido em uma expressão maior, muitos de nós perca a diferença. É semelhante à mistura acidental comum do operador de atribuição vs igualdade. Por esta razão, eu me desliguei das versões de símbolos (não foi fácil) em favor das versões de palavras. Prefiro que alguém os analise devido ao nosso amor pelas coisas antigas do que tentar insetos.
fonte
/Za
) para oferecer suporte às palavras-chave alternativas (consulte stackoverflow.com/a/555524/368896 ). Isso provavelmente também tem outros impactos. Portanto, no Visual Studio, não é necessariamente seguro seguir este conselho.x | y
é suficientemente distinto visualmente (em fontes monoespaçadas) dex || y
, mas acho o!
in, por exemplo,if (!f(xyz) && ...
mais fácil de perder do queif (not f(xyz) && ...
.and
,or
enot
em uma expressão booleana, na verdade melhora a legibilidade e destaca a distinção entre as manipulações de bits. Assim, IMHO, devemos considerar mudar nossos amados velhos hábitos para melhor ...and
eor
influenciam o pensamento das pessoas sobre como deveriam funcionar? Por exemplo, emif (a == b or c)
vez deif (a == b || a == c)
- algo como isso aparece quase todos os dias aqui no StackOverflow. Símbolos abstratos desconectados do idioma inglês reduzem esses erros.Em C ++, são palavras-chave reais. Em C, são macros definidas em
<iso646.h>
. Consulte http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .fonte
and
e&&
são funcionalmente iguais em C ++. Os operadoresand
eor
são C ++ verdadeiramente válidos e fazem parte do padrão da linguagem.Para elaborar outras respostas com um exemplo concreto, há uma outra razão além de apenas "legibilidade" a preferir
and
mais&&
. Soletrar "e" explicitamente quando um AND lógico é o que você quer dizer elimina a possibilidade de bugs sutis.Considere isto:
Todas as três instruções if serão compiladas, mas a última significa algo totalmente diferente e não intencional!
Se você sempre usa
and
quando quer dizer AND lógico, nunca poderá digitar acidentalmente um único "&" e fazer com que seu código seja compilado com êxito e executado com resultados misteriosos.Outro bom exercício: tente omitir o caractere "e" por acidente e veja o que acontece. ;)
fonte
and
e&&
são funcionalmente idênticos" à resposta ... E se você ler minha resposta, verá que NÃO estou dizendo que é sobre legibilidade;)