it-swarm.com.de

Gibt es ein Schlüsselwort oder einen Operator für "nor"?

Gibt es ein Operatoräquivalent von nor ? Zum Beispiel ist meine Lieblingsfarbe weder grün noch blau.

Und der Code wäre gleichbedeutend mit:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}
56
1.21 gigawatts

Obwohl Mainstream-Sprachen keine dedizierten NOR und NAND-Operatoren haben, tun dies einige weniger bekannte Sprachen (zum Beispiel einige "Golf" -Sprachen). Zum Beispiel APL hat und für NOR bzw. NAND.

Eine weitere Klasse von Beispielen findet sich in Hardware-Design-Sprachen wie VHDL , Verilog usw. NAND und NOR-Gatter sind im Hardware-Design sehr nützlich, da sie normalerweise billiger sind (weniger Transistoren erfordern) als das Ersatzschaltbild aus UND/ODER/NICHT-Gattern, was einer der Gründe ist, warum Hardware-Design-Sprachen dazu neigen, sie einzuschließen, ein anderer Grund dafür ist, dass sie für bestimmte Tricks nützlich sein können.

71
nomadictype

Nein, es gibt keinen Operator nor in einer allgemeinen Mainstream-Programmiersprache.

Warum ?

Hauptsächlich, weil es schwer zu lesen ist:

  • es erfordert die mentale Kombination mehrerer Operatoren (" und nicht " oder in einem literarischeren Stil: " weiter negativ "," jedes unwahre " )
  • es impliziert ein implizites not für den ersten Operanden, aber der Leser versteht dies erst danach
  • es unterscheidet sich von menschlichen Sprachen, die eine explizite Negation für den ersten Operanden verwenden, wie " weder x noch y ", " noch x noch y ". Ein Leser könnte also (x nor y) mit (x and not y) Anstatt von ((not x) and (not y))
  • einige Leser sind verwirrt mit der offensichtlichen or -Semantik, die nicht zutrifft

Aber es ist so häufig in Hardware ...

nor ist ein elementares Hardware-Gate , mit dem alle anderen logischen Gates erstellt werden können. Man könnte also argumentieren, dass alle anderen logischen Operatoren Kombinationen sind und nor der einfachste elementare logische Operator ist.

Was für die Hardware gilt, gilt jedoch nicht unbedingt für die Menschen. Und trotz seiner Popularität auf Hardwareebene bieten einige Mainstream-CPUs nicht einmal ein NOR in ihrem Assembler-Befehlssatz an (z. B. x86 ).

Alternativen

Lesbarkeit ist wichtig. Und manchmal kann es auf andere Weise verbessert werden.

Verwendung vorhandener Operatoren

Zum Beispiel:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

Bestellung von Bedingungen

if x==1 or x==2 
     action A
else 
     action B  

anstatt

if x!=1 and x!=2 
    action B
else 
    action A

Verwendung der till-Schleife

Einige Sprachen bieten auch Schleifenanweisungen an, mit denen Bedingungen entweder mit while oder mit until ausgedrückt werden können, sodass Sie den "positiveren" Weg wählen können. Diese Anweisungen sind zum Beispiel until c do ... in Ruby , do until c ... in vb oder repeat ... until c in Pascal und seine Nachkommen.

Zum Beispiel:

Until (x==1 or x==2) do
     ...

ist äquivalent zu:

While (x!=1 and x!=2)
    ...

Mach eine Funktion

Wenn Sie die Syntax nor weiterhin bevorzugen, können Sie eine Funktion definieren, jedoch nur, wenn Sie keine Verknüpfung erwarten:

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

Es gibt einen Lesbarkeitsvorteil der Funktion gegenüber dem Operator, 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.

45
Christophe

@ KilianFoths Kommentar zu der Frage ist genau richtig.

Sie können nor aus not und or synthetisieren:

if (x nor y)

ist genau das gleiche wie

if (not (x or y))

Die Einführung von nor als separater Operator würde Redundanzen in die Sprache einfü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 Operator nand bekannt - wahrscheinlich, weil sie aus den Operatoren not und and synthetisiert werden kann.

Sie könnten theoretisch eine Sprache mit nur nand oder nur nor Operatoren erstellen. Alle and, or und not könnten dann daraus synthetisiert werden. Das einzige Problem ist, dass dies lächerlich unhandlich wäre. Beispiele finden Sie unter NOR-Logik und NAND-Logik auf Wikipedia.

18
Mael

Ja, APL und einige seiner Dialekte haben noch (und nand). In der APL wird noch mit Bezeichnet (da oder und ~ Ist nicht ):

∇ result←ExampleOne color
  :If (color≡'green')⍱(color≡'blue')
      result←'warm'
  :Else
      result←'cold'
  :EndIf
∇

∇ result←ExampleTwo(x y)
  :If x⍱y
      result←'x is false and y is false'
  :Else
      result←'at least one of them is true'
  :EndIf
∇

Probieren Sie es online aus!

11
Adám

Diese Antwort stammt aus der Assembler-Sprache für einen Computer, der Mitte der 1960er Jahre hergestellt wurde. Das ist ziemlich dunkel, aber in mancher Hinsicht geht es um Ihre Frage.

DEC (Digital Equipment Corporation) brachte den PDP-6-Computer Mitte der 1960er Jahre auf den Markt. Diese Maschine hatte insgesamt 64 Anweisungen, die boolesche Operationen an zwei Operanden waren (einschließlich einiger entarteter Fälle). Diese 64 Anweisungen waren wirklich 16 Operatoren mit 4 Varianten in jedem Operator.

Zwei der Operatoren, ANDCB und ORCB, haben NOR bzw. NAND implementiert (es sei denn, ich bin mit der doppelten negativen Logik verwechselt). Sie können die Opcode-Tabelle sehen Die Opcode-Tabelle ist eigentlich für den PDP-10-Computer gedacht, ein Nachfolger des PDP-6.

Wenn Sie sich die numerische Anweisung in Binärform 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 erforderlich gewesen wäre, nur einige von ihnen zu implementieren. Einige dieser Anweisungen wurden selten, wenn überhaupt, im Assembler-Code angezeigt. Aber sie waren alle da.

ANDCB ist also das Äquivalent von NOR. (wieder, es sei denn, ich habe meine Logik rückwärts bekommen, in diesem Fall ist ORCB das Äquivalent).

10
Walter Mitty

Perl hat das Schlüsselwort unless, mit dem Sie Bedingungen invertieren können:

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

Obwohl nicht NOR Operator), können Sie Ihre Absicht auf ähnliche Weise ausdrücken.

3
Rory Hunter

Der von Ihnen beschriebene Operator nor ist nicht wiederholbar, was zwangsläufig zu vielen schwer zu erkennenden Fehlern führt.

Ihr "Beispiel 2" ist im Wesentlichen das Folgende:

if (false nor false) {
becomes
if (true) {

Aber versuchen Sie es noch einmal mit drei Variablen und sehen Sie, was passiert:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {