Existe um operador equivalente a nem ? Por exemplo, minha cor favorita não é verde nem azul.
E o código seria equivalente a:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
or
e!
, e porque duplos negativos raramente são usados - a maioria das pessoas os acha especialmente difíceis de ler.color not in ['green', 'blue']
Respostas:
Embora os idiomas principais não tenham operadores NOR e NAND dedicados, alguns idiomas menos conhecidos (por exemplo, alguns idiomas "de golfe") possuem. Por exemplo, o APL possui
⍱
e⍲
para NOR e NAND, respectivamente.Outra classe de exemplos pode ser encontrada em linguagens de design de hardware, como VHDL , Verilog , etc. As portas NAND e NOR são bastante úteis no design de hardware devido ao fato de serem geralmente mais baratas (exigindo menos transistores) do que o circuito equivalente feito com AND / OR / NOT portas, que é uma das razões pelas quais as linguagens de design de hardware tendem a incluí-las; outro motivo é que eles podem ser úteis para certos truques de manipulação de bits.
fonte
Não, não existe
nor
operador em nenhuma linguagem de programação convencional de alto nível.Por quê ?
Principalmente porque é difícil ler:
not
no primeiro operando, mas o leitor só entende isso depois(x nor y)
com, em(x and not y)
vez de((not x) and (not y))
or
semântica que não se aplicaMas é tão comum em hardware ...
nor
é um portão de hardware elementar que pode ser usado para criar todos os outros portões lógicos. Portanto, alguém poderia argumentar que todos os outros operadores lógicos são combinações enor
é o operador lógico elementar mais simples.No entanto, o que é verdade para o hardware não é necessariamente verdadeiro para os humanos. E apesar da popularidade no nível do hardware, algumas CPUs convencionais nem oferecem um
NOR
em seu conjunto de instruções do assembler (por exemplo, x86 ).Alternativas
Legibilidade é importante. E, às vezes, pode ser aprimorado por outros meios.
Uso de operadores existentes
Por exemplo:
Ordenação de condições
ao invés de
Uso do loop até
Alguns idiomas também oferecem instruções de loop que permitem expressar condições com
while
ou comuntil
, permitindo que você escolha a maneira mais "positiva". Estas instruções são por exemplountil c do ...
em rubi ,do until c ...
em v , ourepeat ... until c
em Pascal e seus descendentes.Por exemplo:
é equivalente a:
Faça uma função
Agora, se você ainda prefere a
nor
sintaxe, pode definir uma função, mas apenas se não espera que um atalho ocorra:Há uma vantagem de legibilidade da função sobre o operador, porque o leitor imediatamente entende que a negação se aplica a todos os argumentos. Em alguns idiomas, você pode definir uma função com um número variável de argumentos.
fonte
while (not (x == 1 or x == 2))
acho ax != 1 and x != 2
versão difícil de ler e considero "x nem 1 nem 2" muito mais fácil de processar do que "x não é 1 e x não é 2".Repeat
...Until
sempre executa o corpo do loop pelo menos uma vez. Se x for 1, o corpo do loop ainda será executado, mas não será repetido. OWhile
loop não executará o corpo neste caso.nor(x,y)
são sempre avaliados depende do idioma e de comonor()
é implementado. Existem idiomas (D, Io, ...) onde a função chamada pode decidir se e quando avaliar argumentos.O comentário de @ KilianFoth sobre a questão está no local.
Você pode sintetizar
nor
a partir denot
eor
:é exatamente o mesmo que
Introduzir
nor
como um operador separado introduziria redundâncias no idioma, que não são necessárias nem desejadas (ou - que não são necessárias e não desejadas).Da mesma forma, não conheço nenhum idioma que tenha um
nand
operador - provavelmente porque ele pode ser sintetizado a partir denot
eand
operadores.Você poderia, em teoria, criar uma linguagem com apenas
nand
ou apenasnor
operadores. Todosand
,or
enot
poderia, então, por synthesied deles. O único problema é que isso seria ridiculamente pesado. Para exemplos, consulte lógica NOR e lógica NAND na Wikipedia.fonte
nor
não estão incluídas. Caso contrário, por que os idiomas têmand
eor
? Eles são redundantes, graças a De Morgan. Na verdade, você poderia substituir todos os três operadores lógicos convencionais (and
,or
,not
), fornecendo apenasnor
, como você observou, com razão.and
,or
enot
- porque é isso que a maioria das linguagens humanas usa. Depois de combinar o modelo mental de e / ou / não, nem & nand se tornam redundantes. Sua redundância é mesmo codificada em seus nomes: "n (ot) e" and "n (ot) ou". Se tivéssemos termos ingleses distintos e preexistentes para eles, e não apenas sintetizados, você provavelmente os veria com mais frequência.not
,and
,or
. Por exemplo, alguns dialetos BASIC (GW-BASIC, QuickBASIC,…) têm IMP exclusivo ou XOR, IMP implicação (→ NÃO (x XOR y)) e EQV equivalente (→ NÃO (x) OR y) como operadores adicionais.Sim, APL e alguns de seus dialetos têm nem (e NAND ). Em APL, nem é denotada
⍱
(desde∨
é ou e~
é não ):Experimente online!
fonte
Esta resposta é da linguagem assembler para um computador fabricado em meados da década de 1960. Isso é bastante obscuro, mas, em alguns aspectos, trata da sua pergunta.
A DEC (Digital Equipment Corporation) lançou o computador PDP-6 em meados da década de 1960. Esta máquina tinha um total de 64 instruções que eram operações booleanas em dois operandos (incluindo alguns casos degenerados). Essas 64 instruções eram realmente 16 operadores com 4 variantes em cada operador.
Dois dos operadores, ANDCB e ORCB implementaram NOR e NAND, respectivamente (a menos que eu esteja confuso com a lógica dupla negativa). Você pode ver a tabela opcode . A tabela opcode é realmente para o computador PDP-10, um sucessor do PDP-6.
Se você observar as instruções numéricas em binário, elas ficarão mais interessantes. Acontece que, para todos os códigos de operação no intervalo 400-477 (octal), quatro bits na própria instrução fornecem uma tabela verdade de quatro bits para 16 possíveis operadores booleanos. Alguns desses operadores ignoram uma ou ambas as entradas. Por exemplo, SETZ e SETO ignoram as duas entradas.
Os projetistas do PDP-6 exploraram esse fato para implementar todas essas instruções com menos lógica do que seria necessário para implementar apenas algumas delas. Algumas dessas instruções raramente apareceram, se é que alguma vez, no código da linguagem assembly. Mas eles estavam todos lá.
Portanto, ANDCB é o equivalente a NOR. (novamente, a menos que eu tenha minha lógica de trás para frente, caso em que ORCB é o equivalente).
fonte
Perl tem a
unless
palavra - chave que permite inverter condicionais:Embora não seja um operador NOR, você pode expressar sua intenção de maneira semelhante.
fonte
O
nor
operador, como você descreveu, não seria repetível, o que levaria a muitos bugs difíceis de detectar.O seu "Exemplo 2" é essencialmente este:
Mas tente novamente com três variáveis e veja o que acontece:
fonte