Was ist das =! Operator? [duplicate]

Lesezeit: 8 Minuten

Benutzeravatar von m0nhawk
m0nhawk

Ich war überrascht von diesem Code:

if (a =! b) { // let it be on false
    ...
}

Aber a wird nie durch einen Wert zugewiesen. Was hat es mit diesem Operator auf sich?

  • "But a is never assigned by a value" – was willst du damit sagen?

    – AnT steht zu Russland

    9. Januar 2014 um 19:20 Uhr

  • lol, hier ist die Java-Version derselben Frage.

    – Mystisch

    9. Januar 2014 um 21:34 Uhr

  • Es ist fast Yodas != Operator. „a ist nicht b“. Besser wäre “a, b, gleich nicht”. Aber a b =! oder a,b =! kompiliert nicht.

    – allquixotisch

    9. Januar 2014 um 22:34 Uhr

  • Dies weist eine bemerkenswerte Ähnlichkeit mit dem Operator “geht zu” auf --> wie verwendet in while(i --> 10). Siehe stackoverflow.com/questions/1642028/…

    – Jens

    10. Januar 2014 um 8:03 Uhr

  • Sie haben diese Frage mit dem C++-Tag markiert.. Aufgrund der Operatorüberladung kann es also wirklich alles sein, je nach Typ von a. In diesem Fall ist der überladene Operator the =. Es sei denn, Sie verwenden eine Variante von C oder C++ mit hat dafür eine besondere Bedeutung

    – Javier

    10. Januar 2014 um 15:50 Uhr

Das sind zwei Operatoren, = und !, nicht eins. Es könnte eine verschleierte Art zu schreiben sein

a = !b;
if (a) {
    // whatever
}

Einstellung a zur logischen Umkehrung von bund testen, ob das Ergebnis wahr ist (oder äquivalent, ob b war falsch).

Oder es könnte ein Tippfehler sein a != b.

  • Ich frage mich, ob es ein Tippfehler von jemandem war, der versucht hat, != einzugeben, zumal es sich um eine if-Anweisung handelt

    – Cory Kramer

    9. Januar 2014 um 19:21 Uhr

  • Leider kann es vorkommen, dass jemand dies einfach als “seinen Stil” betrachtet.

    – Radiodef

    9. Januar 2014 um 20:47 Uhr

  • Wer verschleierten Code schreibt, indem er sich eigene Operatoren ausdenkt, kann das --> Hölle. Warte, neeeeeein!

    – corsiKa

    9. Januar 2014 um 23:12 Uhr

  • @Cyber ​​ist mit ziemlicher Sicherheit kein Tippfehler, da der folgende Kommentar angesichts dessen, was er tatsächlich tut, einen vagen logischen Sinn ergibt. Ich könnte diesen Kommentar ohne den Code nicht interpretieren, aber er scheint definitiv zuzustimmen.

    – Jules

    10. Januar 2014 um 5:42 Uhr

  • Wenn bei wichtigen Verschleierungspunkten der =-Operator überschrieben würde, um etwas ANDERES als die LHS zurückzugeben, könnten Sie WIRKLICHEN Spaß haben.

    – Aron

    10. Januar 2014 um 6:06 Uhr

Vor langer Zeit, als Dinosaurier die Erde durchstreiften und C unter UNIX der 5. Ausgabe auf PDP-11s lief, =! war der ‘Ungleich’-Operator. Diese Verwendung wurde durch die Erstellung von veraltet Standard-Calso bedeutet es jetzt “die logische Umkehrung zuweisen”, wie in a = !b. Dies ist ein gutes Argument dafür, binäre Operatoren immer mit Leerzeichen zu umgeben, nur um es dem klar zu machen Menschen Lesen des Codes, was der Compiler denkt.

Ich bin ein bisschen überrascht, dass niemand sonst dies erwähnt hat, aber andererseits bin ich vielleicht der einzige SO-Benutzer, der jemals einen so alten C-Compiler angefasst hat.

  • +1: Ich schloss jede Art von alter Syntax aus, als ich das sah // einzeiliger Kommentar. Dieser Code hat C++ oder eine neuere Version von C sein, damit es keine hat /* ... */ Kommentar. Trotzdem nette Kleinigkeiten.

    – Andon M. Coleman

    10. Januar 2014 um 4:03 Uhr


  • s/dinosaurier/Kompusauren 🙂

    – Ray Total

    10. Januar 2014 um 7:35 Uhr

  • Dies ist eigentlich die einzig gute Antwort auf die Frage „Worum geht es bei diesem Operator?“. Alle anderen scheinen zu versuchen, die Existenz des Operators zu ignorieren.

    – Kevin

    10. Januar 2014 um 8:24 Uhr

  • Waren Dinosaurier also so cool, wie wir uns das vorstellen?

    – Bolov

    10. Januar 2014 um 9:24 Uhr

  • In älteren Tagen vor dem Sturz mächtiger Könige in Gondolin kehrten die alten Schreiber auch die Reihenfolge der Zuweisungsoperatoren um und schrieben a =+ b zu bedeuten, was wir jetzt als darstellen a += b. Digraphische Operatoren haben eine unangenehme Art, sich mit monographischen zu verwechseln, wenn Leerzeichen keine Rolle spielen, aber die Reihenfolge: Überlegen Sie a =- b,a = -bvs a -= b. Hier sind seit jeher Drachen, aber keiner ist so groß wie zuvor, nachdem Earendil Ancalagon den Schwarzen getötet und Thangoradrim unter seinem Sturz zerbrochen hatte. Ich war dabei, als wir dachten, das Böse sei für immer besiegt, aber es kehrt immer wieder aus den dunkelsten Codes zurück, um uns aufs Neue zu beunruhigen.

    – tchrist

    11. Januar 2014 um 15:13 Uhr


a wird die boolesche Negation von zugewiesen b in dieser Zeile. Es ist nur falsch formatiert

if( a = !b ) {

… und eine böse versteckte Aufgabe in einer Bedingung.

  • Zuweisungen innerhalb einer Bedingung sind nichts Böses … obwohl in diesem Fall die Verwendung von Leerzeichen verwirrend ist.

    – Thomas

    11. Januar 2014 um 1:52 Uhr

  • Zuweisungen in einer Bedingung sind in der Tat böse. Beim Programmieren ist es wichtig, etwas zu produzieren, das mit minimalem Aufwand gelesen und verstanden werden kann. Lesbarkeit ist ein wichtiger Teil der Wartbarkeit. Wenn Sie also eine Bedingung schreiben, lassen Sie es wie eine Bedingung aussehen. Wenn Sie eine Aufgabe erledigen, lassen Sie es wie eine Aufgabe aussehen. Versuchen Sie niemals, das eine als das andere zu tarnen oder das eine im anderen zu begraben.

    – Dawud ibn Kareem

    11. Januar 2014 um 18:04 Uhr

  • while (--t) { ... } ist üblich, aber es ist nicht gerade der Zuweisungsoperator.

    – Vorticus

    12. Januar 2014 um 8:03 Uhr

  • @Vortico, aber es ist nicht so gut lesbar und kann Kopfschmerzen verursachen, wenn jemand schreibt --t+yzum Beispiel

    – Anzeigename

    12. Januar 2014 um 8:22 Uhr

Benutzeravatar von splrs
splrs

a =! b 

ist nur eine lustige Art zu setzen

a = !b

dh die Zuordnung von not b zu a.

Der Wert des Ausdrucks ist a nach dem Auftrag.

Mit dem folgenden Code können Sie sehen, dass der Wert des Ausdrucks a = !b ist !false (dh true), und Sie können dann sehen, dass die Zuweisung stattgefunden hat, indem Sie den Wert von überprüfen awas auch ist true.

#include <iostream>

int main() 
{ 
    bool a = false;
    bool b = false;

    if(a)
        printf("a is true!\n");
    else
        printf("a is false!\n");

    if(a = !b)
        printf("expression is true!\n");
    else
        printf("expression is false!\n");

    if(a)
        printf("a is true!\n");
    else
        printf("a is false!\n");

}

Ergebnis:

a is false!
expression is true!
a is true!

Benutzeravatar von SK
SK.

Operatoren in C++

Laut C/C++-Operatorenliste gibt es keinen Operator wie z =!. Es gibt jedoch einen Operator != (Nicht gleichzusetzen mit, Vergleichsoperatoren/relationaler Operator)

Es gibt zwei Möglichkeiten.

  1. Es könnte Tippfehler sein wie mir das aufgefallen ist =! Betreiber ist drin if Aussage und jemand versucht zu tippen != Anstatt von =! Weil != ist der Vergleichsoperator, der zurückkehrt richtig oder falsch.
  2. Möglicherweise hat der Entwickler versucht, die boolesche Negation von zuzuweisen b zu a und er/sie hat einen Tippfehler gemacht und vergessen, ein Leerzeichen nach dem Gleichheitszeichen zu setzen. So interpretiert es jedenfalls der Compiler. Entsprechend Operatorvorrang in c++:
    • Operator Logisches NICHT (!) Vorrang ist 3 und Assoziativität ist Rechts nach links
    • Operator Direkte Zuweisung (=) Vorrang ist 16 und Assoziativität ist Rechts nach links

  • danke für den Link zu den Operator-Präzedenzfällen, das ist wirklich wichtig, im Allgemeinen zu beachten.

    – 2rs2ts

    10. Januar 2014 um 3:22 Uhr

  • Bitte erklären Sie, warum Operatorpriorität und Assoziativität für das Parsen wichtig sind a =! b

    – Mathias

    11. Januar 2014 um 13:35 Uhr

  • =! ist kein einziger Operator, sie sind zwei. Der Compiler verwendet also Vorrang und Assoziativität, um diese beiden Operatoren auszuführen. Welche muss man zuerst und als zweites ausführen. Möge dir das helfen

    – SK.

    11. Januar 2014 um 14:59 Uhr

Benutzeravatar von Shoe
Schuh

Sie sind zwei verschiedene Operatoren: die = (Zuweisungs-)Operator zusammen mit dem ! Operator. Es kann grundsätzlich in eine Zuweisung von übersetzt werden a zum negierten Wert von b.

if (a = !b)

Aber was der Benutzer wahrscheinlich schreiben wollte, war das != Operator:

if (a != b)

  • danke für den Link zu den Operator-Präzedenzfällen, das ist wirklich wichtig, im Allgemeinen zu beachten.

    – 2rs2ts

    10. Januar 2014 um 3:22 Uhr

  • Bitte erklären Sie, warum Operatorpriorität und Assoziativität für das Parsen wichtig sind a =! b

    – Mathias

    11. Januar 2014 um 13:35 Uhr

  • =! ist kein einziger Operator, sie sind zwei. Der Compiler verwendet also Vorrang und Assoziativität, um diese beiden Operatoren auszuführen. Welche muss man zuerst und als zweites ausführen. Möge dir das helfen

    – SK.

    11. Januar 2014 um 14:59 Uhr

Benutzeravatar der Community
Gemeinschaft

Das ist kein einzelner Operator, aber es ist eine großartige Möglichkeit, Code zu verschleiern.

Wenn es geschrieben wäre a=!b Stattdessen lässt Sie der Leerraum möglicherweise nicht glauben, dass es sich um einen einzelnen Operator handelt.

Compiler haben Warnungen für die Zuweisung in einem bedingten Ausdruck, es sei denn, Sie schließen die gesamte Anweisung in Klammern ein, und dies ist ein perfektes Beispiel dafür, wann diese Warnung nützlich wäre.

Beide Anweisungen sind funktional identisch, aber eine generiert eine Warnung und die andere nicht:

if (a =! b)   // Generates a warning with `-Wparentheses` (gcc)

if ((a =! b)) // No such warning

-WKlammern

Warnen Sie, wenn Klammern in bestimmten Kontexten weggelassen werden, z. B. wenn es eine Zuweisung in einem Kontext gibt, in dem ein Wahrheitswert erwartet wird, oder wenn Operatoren verschachtelt sind, deren Vorrang häufig verwirrt wird.

Das setzt natürlich voraus, dass Sie ein verantwortungsvoller Programmierer sind und die Warnungen, die Ihr Compiler ausspuckt, auch wirklich lesen.


Wenn Sie Leerzeichen sinnvoller verwenden, lautet die Aussage tatsächlich:

if (a = !b) // Assign A the value of (logical) NOT B and then test the truth

Die oben erwähnte Compiler-Warnung ist tatsächlich nützlich für den Fall, dass die Person, die diesen Code geschrieben hat, versehentlich transponiert hat ! und =. Aus den kryptischen Inline-Kommentaren in Ihrer ursprünglichen Frage geht jedoch hervor, a = !b ist wohl Absicht des Autors.

1425260cookie-checkWas ist das =! Operator? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy