Frage

& hat &&. | hat ||. Warum ^ nicht ^^ haben?

Ich verstehe, dass es nicht ein Kurzschluss sein würde, aber es wäre eine andere Semantik haben. In C ist true wirklich ein Wert ungleich Null. Bitweise XOR ist nicht immer dasselbe, wie logische XOR:

int a=strcmp(str1,str2);// evaluates to 1, which is "true"
int b=strcmp(str1,str3);// evaluates to 2, which is also "true"
int c=a ^^ b; // this would be false, since true ^ true = false
int d=a ^ b; //oops, this is true again, it is 3 (^ is bitwise)

Da Sie nicht immer auf einem wahren Wert verlassen 1 oder -1 ist, wäre kein ^^ Betreiber sehr hilfreich sein? Ich habe oft seltsame Dinge wie dies zu tun:

if(!!a ^ !!b) // looks strange
War es hilfreich?

Lösung

Dennis Ritchie Antworten

  

Es gibt sowohl historische und praktische Gründe, warum es keinen ^^ Operator ist.

     

Das ist praktisch: es für den Betreiber nicht viel ist. Der wichtigste Punkt && und || ist die Vorteile ihrer Kurzschlussauswertung nehmen nicht nur aus Gründen der Effizienz, aber häufiger für Ausdruckskraft und Richtigkeit.
  [...]
  Im Gegensatz dazu würde ein ^^ Bediener immer Auswertung erzwingt beiden Arme des Ausdrucks, so gibt es keinen Effizienzgewinn. Darüber hinaus, in welchen Situationen ^^ wirklich gefordert wird, sind ziemlich selten, können jedoch Beispiele geschaffen werden. Diese Situationen kommen seltener und Fremde, wie Sie den operator-- stapeln

if (cond1() ^^ cond2() ^^ cond3() ^^ ...) ...
     

hat die konsequente genau dann, wenn eine ungerade Anzahl der condx()s wahr sind. Im Gegensatz dazu bleibt der && und || Analoga ziemlich plausibel und nützlich.

Andere Tipps

Technisch man bereits vorhanden ist:

a != b

, da dies zu true ausgewertet wird, wenn der Wahrheitswert der Operanden unterscheiden.

Edit:

Volte 's Kommentar:

(!a) != (!b)

ist richtig, weil meine Antwort oben nicht für int Typen funktioniert. Ich will meine löschen, wenn er seine Antwort hinzufügt.

Bearbeiten wieder:

Vielleicht etwas von C ++ Ich vergesse, aber je mehr ich über diese, je mehr ich frage mich, warum Sie jemals if (1 ^ 2) an erster Stelle schreiben. Der Zweck für ^ zu Exklusiv-oder zwei Zahlen zusammen (die zu einer anderen Zahl ausgewertet wird), nicht wandeln sie in Boolesche Werte und vergleichen ihre Wahrheitswerte.

Dies scheint, wie es eine ungeradee Annahme für eine Sprache Designer wäre zu machen.

Für Nicht-bool Operanden, ich denke, was Sie wollen würde, ist für a ^^ b ausgewertet werden als:

(a != 0) ^ (b != 0)

Nun, haben Sie die obige Option und Sie haben ein paar Optionen in anderen Antworten aufgelistet.

Der Operator ^^ würde für bool Operanden überflüssig. Sprechen nur über Boolesche Operanden, für die Zwecke der Beweisführung, lassen Sie uns so tun, dass ^ war bitweise nur und dass ^^ existierte als eine logische XOR. Sie haben dann diese Möglichkeiten:

  • & - bitweise UND - immer wertet beiden Operanden
  • && - Logische UND - nicht immer beide Operanden bewerten
  • | - bit- oder - immer wertet beiden Operanden
  • || - Logisches ODER - nicht immer beide Operanden bewerten
  • ^ - bitweise XOR - müssen immer beide Operanden bewerten
  • ^^ - Logische XOR - müssen immer beide Operanden bewerten

Warum haben sie nicht schaffen ^^ im wesentlichen numerischen Werte in bools umwandeln und dann als ^ handeln? Das ist eine gute Frage. Vielleicht, weil es mehr ist potenziell verwirrend als && und ||, vielleicht, weil Sie leicht das Äquivalent von ^^ mit anderen Betreibern konstruieren können.

Ich kann nicht sagen, was in den Köpfen von Kernighan und Ritchie war, als sie C erfunden, aber sie machte einen kurzen Hinweis auf „würde ein Kurzschluss nicht“, und ich vermute, das ist der Grund: Es ist nicht möglich, sie konsequent umzusetzen. Sie können nicht XOR Kurzschluss, wie Sie können AND und OR, so ^^ konnte nicht vollständig parallel && und ||. So könnten die Autoren haben auch entschieden, dass eine Operation machen, die Art der Art wie seine parallel sieht die andere, aber nicht ganz schlimmer wäre, als es gar nicht haben.

Persönlich, der Hauptgrund, warum ich verwende && und || ist für den Kurzschluss eher als die nicht bitweise. Eigentlich benutze ich nur sehr selten die Bit-Operatoren überhaupt.

Eine andere Lösung zu den oben geschrieben (auch wenn es einen anderen Zweig im Code erfordert) wäre:

if ( (a? !b : b ) )

das entspricht xor.

In Java der ^ Operator in der Tat tut XOR logisch, wenn auf zwei Boolesche Operanden (wie & und | in Java tut nicht kurzgeschlossen logische AND und OR bzw. wenn auf booleans angewandt). Der Hauptunterschied mit C / C ++ ist, dass C / C ++ können Sie ganze Zahlen und Boolesche Werte mischen, während Java nicht.

Aber ich denke, es ist eine schlechte Praxis ist sowieso ganzen Zahlen als booleans zu verwenden. Wenn Sie logische Operationen tun wollen, sollten Sie entweder bool Werte halten, oder ganze Zahlen, die entweder 0 oder 1. Dann ^ fein wie logische XOR funktioniert.

Eine analoge Frage sei zu fragen, wie würden Sie tun nicht kurzgeschlossen logische AND und OR in C / C ++? Die übliche Antwort ist jeweils die & und | Operatoren zu verwenden. Aber noch einmal, dies hängt von den Werten sein bool oder entweder 0 oder 1. Wenn Sie irgendwelche ganzzahlige Werte zulassen, dann dies funktioniert auch nicht.

Unabhängig von dem Fall

für oder gegen ^^ als Operator, Sie zB mit strcmp() saugt. Es macht keinen Wahrheitswert (wahr oder falsch) zurückgeben, es gibt eine Beziehung zwischen den Eingängen, als eine ganze Zahl codiert wird.

Sicher, eine ganze Zahl kann als Wahrheitswert in C interpretiert werden, wobei in diesem Fall 0 „falsch“ ist und alle anderen Werte sind „true“, aber das ist das Gegenteil von dem, was strcmp() zurückkehrt.

sollte Ihr Beispiel beginnen:

int a = strcmp(str1, str2) == 0; // evaluates to 0, which is "false"
int b = strcmp(str1, str3) == 0; // evaluates to 0, which is also "false"

Sie müssen den Rückgabewert mit 0 vergleichen Sie es mit einem richtigen Booleschen Wert konvertiert die angibt, ob die Strings gleich waren oder nicht.

Mit "richtigen" booleans, vertreten kanonisch als 0 oder 1, arbeitet die bitweise ^ Operator viel besser, auch ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top