Gibt es ein Operatoräquivalent zu nor ? Zum Beispiel ist meine Lieblingsfarbe weder grün noch blau.
Und der Code wäre äquivalent zu:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
or
und!
haben und weil Doppelnegative selten verwendet werden - die meisten Leute finden sie besonders schwer zu lesen.color not in ['green', 'blue']
Antworten:
Obwohl die Hauptsprachen keine speziellen NOR- und NAND-Operatoren haben, sind dies einige weniger bekannte Sprachen (zum Beispiel einige "Golf" -Sprachen). Zum Beispiel APL hat
⍱
und⍲
für NOR und NAND ist.Eine weitere Klasse von Beispielen findet sich in Hardware-Entwurfssprachen wie VHDL , Verilog usw. NAND- und NOR-Gatter sind im Hardware-Entwurf sehr nützlich, da sie normalerweise billiger sind (weniger Transistoren erfordern) als die aus AND / OR / NOT hergestellte Ersatzschaltung Gates, einer der Gründe, warum Hardware-Design-Sprachen diese enthalten; Ein weiterer Grund ist, dass sie für bestimmte Tricks nützlich sein können.
quelle
Nein, es gibt keinen
nor
Operator in irgendeiner gängigen Programmiersprache.Warum ?
Hauptsächlich, weil es schwer zu lesen ist:
not
für den ersten Operanden, aber der Leser versteht dies erst danach(x nor y)
mit(x and not y)
statt mit verwechseln((not x) and (not y))
or
Semantik, die nicht zutrifftAber es ist so üblich in Hardware ...
nor
ist ein elementares Hardware-Gatter , mit dem alle anderen logischen Gatter erstellt werden können. Man könnte also argumentieren, dass alle anderen logischen Operatoren Kombinationen sind undnor
der einfachste elementare logische Operator sind.Was für die Hardware zutrifft, trifft jedoch nicht unbedingt auf die Menschen zu. Und trotz ihrer Beliebtheit auf Hardware-Ebene bieten einige Mainstream-CPUs nicht einmal einen
NOR
Assembler-Befehlssatz (z . B. x86 ) an.Alternativen
Lesbarkeit ist wichtig. Und manchmal kann es auf andere Weise verbessert werden.
Nutzung vorhandener Operatoren
Zum Beispiel:
Bestellung von Konditionen
Anstatt von
Verwendung von till loop
Einige Sprachen bieten auch Schleifenanweisungen an, mit denen Bedingungen entweder mit
while
oder mituntil
ausgedrückt werden können, sodass Sie den "positiveren" Weg wählen können. Diese Anweisungen sind zum Beispieluntil c do ...
in Ruby ,do until c ...
in VB oderrepeat ... until c
in Pascal und seinen Nachkommen.Zum Beispiel:
ist äquivalent zu:
Mach eine Funktion
Wenn Sie die
nor
Syntax weiterhin bevorzugen , können Sie eine Funktion definieren, aber nur, wenn Sie nicht damit rechnen, dass eine Verknüpfung erstellt wird:Die Funktion hat gegenüber dem Operator einen Lesbarkeitsvorteil, da der Leser sofort versteht, dass die Negation für alle Argumente gilt. In einigen Sprachen können Sie eine Funktion mit einer variablen Anzahl von Argumenten definieren.
quelle
while (not (x == 1 or x == 2))
ich diex != 1 and x != 2
Version schwer zu lesen finde und finde, dass "x weder 1 noch 2 ist" viel einfacher zu verarbeiten ist als "x ist nicht 1 und x ist nicht 2".Repeat
...Until
führt den Schleifenkörper immer mindestens einmal aus. Wenn x 1 ist, wird der Schleifenkörper immer noch ausgeführt, aber nicht wiederholt. DieWhile
Schleife führt in diesem Fall den Body nicht aus.nor(x,y)
immer ausgewertet werden, hängt von der Sprache und dernor()
Implementierung ab. Es gibt Sprachen (D, Io,…), in denen die aufgerufene Funktion entscheiden kann, ob und wann Argumente ausgewertet werden sollen.@ KilianFoths Kommentar zu der Frage ist genau richtig.
Sie können synthetisieren
nor
ausnot
undor
:ist genau das gleiche wie
Die Einführung
nor
als separater Operator würde zu Redundanzen in der Sprache führen, die weder benötigt noch gewünscht werden (oder - die nicht benötigt und nicht gewünscht werden).Ebenso ist mir keine Sprache mit einem
nand
Operator bekannt - wahrscheinlich, weil sie ausnot
undand
Operatoren synthetisiert werden kann.Theoretisch könnten Sie eine Sprache
nand
nur mitnor
Operatoren oder nur mit Operatoren erstellen . Alles vonand
,or
undnot
konnte dann aus ihnen synthetisiert werden. Das einzige Problem ist, dass dies lächerlich unhandlich wäre. Beispiele finden Sie unter NOR-Logik und NAND-Logik in Wikipedia.quelle
nor
nicht enthalten sind. Warum habenand
und sonst Sprachenor
? Sie sind dank De Morgan überflüssig. In der Tat könnte man alle drei herkömmlichen logischen Operatoren ersetzen (and
,or
,not
) , indem sie nurnor
, wie Sie richtig beobachtet.and
,or
undnot
- weil das die meisten menschlichen Sprachen verwenden. Sobald Sie mit dem mentalen Modell von und / oder / nicht übereinstimmen, werden Sie auch nicht mehr redundant. Ihre Redundanz ist sogar in ihren Namen verschlüsselt: "n (ot) und" und "n (ot) oder". Wenn wir unterschiedliche, bereits existierende englische Begriffe für sie hätten und nicht nur synthetisierte, dann würden Sie sie wahrscheinlich häufiger sehen.not
,and
,or
. Zum Beispiel haben einige BASIC-Dialekte (GW-BASIC, QuickBASIC,…) als zusätzliche Operatoren Exclusive oder XOR, Implication IMP (→ NOT (x XOR y)) und Equivalence EQV (→ NOT (x) OR y).Ja, APL und einige seiner Dialekte haben noch (und nand ). In APL wird noch bezeichnet
⍱
(da∨
ist oder und~
ist nicht ):Probieren Sie es online!
quelle
Diese Antwort stammt aus der Assemblersprache für einen Computer, der Mitte der 1960er Jahre hergestellt wurde. Das ist ziemlich dunkel, aber in mancher Hinsicht wird Ihre Frage angesprochen.
DEC (Digital Equipment Corporation) brachte Mitte der 1960er Jahre den PDP-6-Computer auf den Markt. Diese Maschine hatte insgesamt 64 Anweisungen, die boolesche Operationen mit zwei Operanden waren (einschließlich einiger entarteter Fälle). Diese 64 Anweisungen waren wirklich 16 Bediener mit 4 Varianten in jedem Bediener.
Zwei der Operatoren, ANDCB und ORCB, implementierten NOR bzw. NAND (es sei denn, ich bin in der doppelt negativen Logik verwechselt). Sie können die Opcode-Tabelle sehen . Die Opcode-Tabelle ist eigentlich für den PDP-10-Computer, einen Nachfolger des PDP-6.
Wenn Sie sich die numerische Anweisung in binärer Form ansehen, wird sie interessanter. Es stellt sich heraus, dass für alle Opcodes im Bereich von 400 bis 477 (oktal) vier Bits im Befehl selbst eine Vier-Bit-Wahrheitstabelle für 16 mögliche Boolesche Operatoren bereitstellen. Einige dieser Operatoren ignorieren eine oder beide Eingaben. Zum Beispiel ignorieren SETZ und SETO beide Eingänge.
Die Entwickler des PDP-6 nutzten diese Tatsache, um alle diese Anweisungen mit weniger Logik zu implementieren, als es nötig gewesen wäre, nur einige von ihnen zu implementieren. Einige dieser Anweisungen wurden, wenn überhaupt, selten im Assembler-Code angezeigt. Aber sie waren alle da.
ANDCB ist also das Äquivalent von NOR. (Wieder, es sei denn, ich habe meine Logik falsch verstanden. In diesem Fall ist ORCB das Äquivalent.)
quelle
Perl hat das
unless
Schlüsselwort, mit dem Sie Bedingungen umkehren können:Obwohl Sie kein NOR-Operator sind, können Sie Ihre Absicht auf ähnliche Weise ausdrücken.
quelle
Der
nor
Operator, wie Sie ihn beschrieben haben, wäre nicht wiederholbar, was zu vielen schwer zu erkennenden Fehlern führen wird.Ihr "Beispiel 2" lautet im Wesentlichen:
Aber versuchen Sie das noch einmal mit drei Variablen und sehen Sie, was passiert:
quelle