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


56

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
}

12
Nein, weil wir bereits orund !haben und weil Doppelnegative selten verwendet werden - die meisten Leute finden sie besonders schwer zu lesen.
Kilian Foth

70
@KilianFoth ist richtig. Trotzdem sollten Downvotes für schlechte Fragen sein, nicht für Fragen, die wir nicht mögen. Darüber hinaus gibt es bereits drei Stimmen, um die Frage abzuschließen, da sie "meinungsbasiert" wäre, obwohl die Frage völlig neutral und nicht kontrovers ist (entweder gibt es solche Operatoren in einer exotischen Sprache oder nicht).
Christophe

3
Gibt es einen Namen dafür? Ja noch Ist es ein Operator? In welcher Sprache? Wenn Sie eine Sprache angegeben haben, können Sie diese in den technischen Daten / Dokumenten nachschlagen.
Jonrsharpe

9
@Troyer Ihr Kommentar zeigt das Problem: Sie haben die Logik falsch verstanden. ;) Das ist nicht gleichbedeutend mit einem noch.
jpmc26

3
In Sprachen mit mehr Operatoren wäre dies (zum Beispiel in Python)color not in ['green', 'blue']
Izkata

Antworten:


71

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.


40
APL ist keine Golfsprache , sondern eine Array-orientierte Sprache, die die interaktive Entwicklung von Full-Stack-Multiparadigma-Anwendungen mit industrieller Stärke ermöglicht.
Adám

59
@Adám: Bingo .
Eric Duminil

6
@EricDuminil :-) Es ist aber alles wahr.
Adám

20
@EricDuminil Nein, wirklich. APL ist keine Golfsprache, es ist eine praktische Sprache, die gut Golf spielen kann. Perl ist in dieser Hinsicht ähnlich, oder?
Pavel

13
OP hat eigentlich nicht gesagt, dass APL eine "Golf" -Sprache ist, übrigens.
Will Crawford

45

Nein, es gibt keinen norOperator in irgendeiner gängigen 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 ", " jeweils unwahr " )
  • es impliziert einen Impliziten notfür den ersten Operanden, aber der Leser versteht dies erst danach
  • Es unterscheidet sich von menschlichen Sprachen, die eine explizite Negation des ersten Operanden verwenden, z. B. " weder x noch y ", " noch x noch y ". Ein Leser könnte also (x nor y)mit (x and not y)statt mit verwechseln((not x) and (not y))
  • Einige Leser sind verwirrt mit der scheinbaren orSemantik, die nicht zutrifft

Aber es ist so üblich in Hardware ...

norist 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 und norder 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 NORAssembler-Befehlssatz (z . B. x86 ) an.

Alternativen

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

Nutzung 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 Konditionen

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

Anstatt von

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

Verwendung von till loop

Einige Sprachen bieten auch Schleifenanweisungen an, mit denen Bedingungen entweder mit whileoder mit untilausgedrü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 cin Pascal und seinen 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 norSyntax weiterhin bevorzugen , können Sie eine Funktion definieren, aber nur, wenn Sie nicht damit rechnen, dass eine Verknüpfung erstellt wird:

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

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.


5
Witzigerweise schreibe ich das normalerweise, da while (not (x == 1 or x == 2))ich die x != 1 and x != 2Version 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".
Mael

1
@Baldrickk kannst du das näher erläutern?
Hoffentlich

4
@HopefullyHel helpful Repeat... Untilführt den Schleifenkörper immer mindestens einmal aus. Wenn x 1 ist, wird der Schleifenkörper immer noch ausgeführt, aber nicht wiederholt. Die WhileSchleife führt in diesem Fall den Body nicht aus.
Sina

2
@Baldrickk ja du hast vollkommen recht. Wenn ich Äquivalent schreibe, spreche ich nur über die Schleifenbedingung, da die booleschen Operatoren Gegenstand der Frage sind. Vielen Dank, ich werde es umformulieren, um zu klären
Christophe

3
Ob x und y in nor(x,y)immer ausgewertet werden, hängt von der Sprache und der nor()Implementierung ab. Es gibt Sprachen (D, Io,…), in denen die aufgerufene Funktion entscheiden kann, ob und wann Argumente ausgewertet werden sollen.
Blackjack

18

@ KilianFoths Kommentar zu der Frage ist genau richtig.

Sie können synthetisieren noraus notund or:

if (x nor y)

ist genau das gleiche wie

if (not (x or y))

Die Einführung norals 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 nandOperator bekannt - wahrscheinlich, weil sie aus notund andOperatoren synthetisiert werden kann.

Theoretisch könnten Sie eine Sprache nandnur mit norOperatoren oder nur mit Operatoren erstellen . Alles von and, orund notkonnte 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.


4
Die Entlassungen könnten auch nicht benötigt oder gewünscht werden :)
Dave

@ Dave Das Wortspiel war beabsichtigt, froh zu sehen, dass Sie bemerkt ;-)
Mael

5
Redundanzen allein erklären nicht wirklich, warum sie nornicht enthalten sind. Warum haben andund sonst Sprachen or? 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 nur nor , wie Sie richtig beobachtet.
Konrad Rudolph

1
@KonradRudolph Technisch gesehen ist alles, was Sie brauchen, ein Lambda-Operator . Der Grund, warum wir mehr tun, ist, dem mentalen Modell zu entsprechen, das die meisten Programmierer haben. Die meisten Programmierer denken über Logik nach and, orund not- 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.
RM

1
Re Redundanz als Argument: Es gibt Sprachen mit mehr als 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).
Blackjack

11

Ja, APL und einige seiner Dialekte haben noch (und nand ). In APL wird noch bezeichnet (da ist oder und ~ist nicht ):

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

Probieren Sie es online!


10

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.)


3

Perl hat das unlessSchlüsselwort, mit dem Sie Bedingungen umkehren können:

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

Obwohl Sie kein NOR-Operator sind, können Sie Ihre Absicht auf ähnliche Weise ausdrücken.


3

Der norOperator, 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:

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

Aber versuchen Sie das 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) {
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.