Czy istnieje operator równoważny ani ? Na przykład moim ulubionym kolorem nie jest ani zielony, ani niebieski.
A kod byłby równoważny z:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
or
i!
ponieważ podwójne negatywy są rzadko używane - większość ludzi uważa je za szczególnie trudne do odczytania.color not in ['green', 'blue']
Odpowiedzi:
Chociaż języki głównego nurtu nie mają dedykowanych operatorów NOR i NAND, niektóre mniej znane języki (na przykład niektóre języki „golfa”). Na przykład, APL ma
⍱
oraz⍲
dla NOR i NAND odpowiednio.Inną klasę przykładów można znaleźć w językach projektowania sprzętu, takich jak VHDL , Verilog itp. Bramki NAND i NOR są dość przydatne w projektowaniu sprzętu, ponieważ zwykle są tańsze (wymagające mniejszej liczby tranzystorów) niż równoważny obwód wykonany z AND / OR / NOT gates, który jest jednym z powodów, dla których języki projektowania sprzętu zawierają je; innym powodem jest to, że mogą być przydatne w przypadku niektórych sztuczek związanych z bitem.
źródło
Nie, nie ma
nor
operatora w żadnym głównym języku programowania wysokiego poziomu.Dlaczego ?
Głównie dlatego, że trudno jest odczytać:
not
pierwszy operand, ale czytelnik rozumie to dopiero później(x nor y)
z(x and not y)
zamiast((not x) and (not y))
or
semantycznym, który nie ma zastosowaniaAle to tak powszechne w sprzęcie ...
nor
jest elementarną bramą sprzętową, której można użyć do wykonania wszystkich innych bram logicznych. Można więc argumentować, że wszystkie pozostałe operatory logiczne są kombinacjami inor
są najprostszym elementarnym operatorem logicznym.Jednak to, co jest prawdziwe dla sprzętu, niekoniecznie musi być prawdziwe dla ludzi. I pomimo popularności na poziomie sprzętowym, niektóre procesory głównego nurtu nawet nie oferują
NOR
w zestawie instrukcji asemblera (np. X86 ).Alternatywy
Czytelność ma znaczenie. A czasem można to poprawić za pomocą innych środków.
Wykorzystanie istniejących operatorów
Na przykład:
Porządkowanie warunków
zamiast
Użyj pętli do
Niektóre języki oferują również instrukcje pętli, które pozwalają wyrazić warunki za pomocą
while
lub za pomocąuntil
, co pozwala wybrać bardziej „pozytywny” sposób. Instrukcje te są na przykładuntil c do ...
w rubinie ,do until c ...
w czasowniku lubrepeat ... until c
w Pascalu i jego potomkach.Na przykład:
jest równa:
Zrób funkcję
Teraz, jeśli nadal wolisz
nor
składnię, możesz zdefiniować funkcję, ale tylko jeśli nie spodziewasz się skrótu:Funkcja ma przewagę pod względem czytelności nad operatorem, ponieważ czytelnik natychmiast rozumie, że negacja dotyczy wszystkich argumentów. W niektórych językach możesz zdefiniować funkcję o zmiennej liczbie argumentów.
źródło
while (not (x == 1 or x == 2))
uważamx != 1 and x != 2
wersję za trudną do odczytania i stwierdzam, że „x nie jest ani 1, ani 2”, dużo łatwiejsze do przetworzenia niż „x nie jest 1, a x nie jest 2”.Repeat
...Until
zawsze wykonuje ciało pętli przynajmniej raz. Jeśli x wynosi 1, ciało pętli jest nadal wykonywane, ale nie jest powtarzane. WWhile
tym przypadku pętla nie wykonuje ciała.nor(x,y)
są zawsze oceniane, zależy od języka i sposobunor()
implementacji. Istnieją języki (D, Io,…), w których wywoływana funkcja może decydować, czy i kiedy należy oceniać argumenty.@ Komentarz KilianFoth do pytania jest na miejscu.
Można syntetyzować
nor
odnot
aor
:jest dokładnie taki sam jak
Wprowadzenie
nor
jako osobnego operatora wprowadziłoby nadmiarowość języka, który nie jest ani potrzebny, ani pożądany (lub - który nie jest potrzebny i nie jest potrzebny).Podobnie, nie znam żadnego języka z
nand
operatorem - prawdopodobnie dlatego, że można go zsyntetyzowaćnot
iand
operatory.Teoretycznie możesz stworzyć język z tylko
nand
lub tylkonor
operatorami. Wszystkoand
,or
inot
może następnie przez synthesied od nich. Jedynym problemem jest to, że byłoby to absurdalnie niewygodne. Na przykład zobacz logikę NOR i logikę NAND na Wikipedii.źródło
nor
nie są uwzględnione. W przeciwnym razie, dlaczego języki mająand
ior
? Są zbędne dzięki De Morganowi. W rzeczywistości, można zastąpić wszystkie trzy konwencjonalne operatorów logicznych (and
,or
,not
) poprzez dostarczanie tylkonor
, jak pan słusznie zauważył.and
,or
inot
- ponieważ to, co najbardziej ludzkie języki użyciu. Po dopasowaniu modelu mentalnego i / lub / nie, wtedy ani & nand nie stają się zbędne. Ich nadmiarowość jest nawet zakodowana w ich nazwach: „n (ot) i” oraz „n (ot) lub”. Gdybyśmy mieli dla nich wyraźne, istniejące wcześniej angielskie terminy, a nie tylko syntezowane, prawdopodobnie zobaczyłbyś je częściej.not
,and
,or
. Na przykład niektóre dialekty BASIC (GW-BASIC, QuickBASIC,…) mają wyłączność lub XOR, implikację IMP (→ NOT (x XOR y)) i równoważność EQV (→ NOT (x) OR y) jako dodatkowe operatory.Tak, APL i niektóre z jego dialektów nie mają ani (i nand ). W APL nie jest oznaczona
⍱
(ponieważ∨
jest albo i~
to nie )Wypróbuj online!
źródło
Ta odpowiedź pochodzi z języka asemblera dla komputera wyprodukowanego w połowie lat sześćdziesiątych. To dość niejasne, ale pod pewnymi względami odpowiada na twoje pytanie.
DEC (Digital Equipment Corporation) wprowadził komputer PDP-6 w połowie lat sześćdziesiątych. Ta maszyna miała w sumie 64 instrukcje, które były operacjami logicznymi na dwóch operandach (w tym niektórych zdegenerowanych przypadkach). Te 64 instrukcje były tak naprawdę 16 operatorami z 4 wariantami w każdym operatorze.
Dwaj operatorzy, ANDCB i ORCB, zaimplementowali odpowiednio NOR i NAND (chyba że jestem zamieszany w podwójną logikę ujemną). Możesz zobaczyć tabelę opcode . Tabela opcode jest w rzeczywistości dla komputera PDP-10, następcy PDP-6.
Jeśli spojrzysz na instrukcję numeryczną w formacie binarnym, staje się ona bardziej interesująca. Okazuje się, że dla wszystkich kodów w zakresie 400–477 (ósemkowe) cztery bity w samej instrukcji zapewniają czterobitową tabelę prawdy dla 16 możliwych operatorów boolowskich. Niektórzy z tych operatorów ignorują jedno lub oba dane wejściowe. Na przykład SETZ i SETO ignorują oba wejścia.
Projektanci PDP-6 wykorzystali ten fakt, aby zaimplementować wszystkie te instrukcje z mniejszą logiką niż w przypadku wdrożenia tylko niektórych z nich. Niektóre z tych instrukcji pojawiały się rzadko, jeśli w ogóle, w kodzie języka asemblera. Ale wszyscy tam byli.
Więc ANDCB jest odpowiednikiem NOR. (ponownie, chyba że mam logikę wstecz, w którym to przypadku ORCB jest równoważne).
źródło
Perl ma
unless
słowo kluczowe, które pozwala odwrócić warunki warunkowe:Nie będąc operatorem NOR, możesz wyrazić swoje zamiary w podobny sposób.
źródło
nor
Operator, jak opisano to nie będzie powtarzalny, co musi prowadzić do wielu trudnych do wykrycia błędów.Twój „Przykład 2” jest zasadniczo taki:
Ale spróbuj ponownie, używając trzech zmiennych i zobacz, co się stanie:
źródło