Nie, nie ma nor
operatora w żadnym głównym języku programowania wysokiego poziomu.
Dlaczego ?
Głównie dlatego, że trudno jest odczytać:
- wymaga mentalnej kombinacji kilku operatorów („ i nie ” lub w bardziej literackim stylu: „ dalsze negatywne ”, „ każdy nieprawdziwy ” )
- implikuje domyślnie
not
pierwszy operand, ale czytelnik rozumie to dopiero później
- różni się od języków ludzkich, które używają wyraźnej negacji pierwszego argumentu, takiego jak „ ani x ani y ”, „ ani x ani y ”. Czytelnik może więc pomylić
(x nor y)
z (x and not y)
zamiast((not x) and (not y))
- niektórzy czytelnicy są myleni z oczywistym
or
semantycznym, który nie ma zastosowania
Ale 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 i nor
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:
if x not in [1,2] // use of 'in' or 'not in' operator instead of x!=1 and x!=2
Porządkowanie warunków
if x==1 or x==2
action A
else
action B
zamiast
if x!=1 and x!=2
action B
else
action A
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ład until c do ...
w rubinie , do until c ...
w czasowniku lub repeat ... until c
w Pascalu i jego potomkach.
Na przykład:
Until (x==1 or x==2) do
...
jest równa:
While (x!=1 and x!=2)
...
Zrób funkcję
Teraz, jeśli nadal wolisz nor
składnię, możesz zdefiniować funkcję, ale tylko jeśli nie spodziewasz się skrótu:
If ( nor(x,y) ) // attention, x and y will always be evaluated
...
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.
or
i!
ponieważ podwójne negatywy są rzadko używane - większość ludzi uważa je za szczególnie trudne do odczytania.