Warum ist x == (x = y) nicht dasselbe wie (x = y) == x?

207

Betrachten Sie das folgende Beispiel:

class Quirky {
    public static void main(String[] args) {
        int x = 1;
        int y = 3;

        System.out.println(x == (x = y)); // false
        x = 1; // reset
        System.out.println((x = y) == x); // true
     }
}

Ich bin nicht sicher, ob es in der Java-Sprachspezifikation ein Element gibt, das das Laden des vorherigen Werts einer Variablen zum Vergleich mit der rechten Seite ( x = y) vorschreibt, das in der durch Klammern angegebenen Reihenfolge zuerst berechnet werden sollte.

Warum wird der erste Ausdruck als false, der zweite als bewertet true? Ich hätte erwartet (x = y), zuerst ausgewertet zu werden, und dann würde es xmit sich selbst verglichen ( 3) und zurückkehren true.


Diese Frage unterscheidet sich von der Reihenfolge der Auswertung von Unterausdrücken in einem Java-Ausdruck darin, dass xes sich hier definitiv nicht um einen Unterausdruck handelt. Es muss für den Vergleich geladen werden, anstatt "ausgewertet" zu werden. Die Frage ist Java-spezifisch und der Ausdruck stammt x == (x = y)im Gegensatz zu weit hergeholten unpraktischen Konstrukten, die üblicherweise für knifflige Interviewfragen entwickelt wurden, aus einem echten Projekt. Es sollte ein einzeiliger Ersatz für die Vergleichs- und Ersetzungssprache sein

int oldX = x;
x = y;
return oldX == y;

Dies war noch einfacher als die x86-CMPXCHG-Anweisung und verdiente einen kürzeren Ausdruck in Java.

John McClane
quelle
62
Die linke Seite wird immer vor der rechten Seite ausgewertet. Die Klammern machen keinen Unterschied.
Louis Wasserman
11
Die Auswertung des Ausdrucks x = yist sicherlich relevant und verursacht den Nebeneffekt, xder auf den Wert von gesetzt wird y.
Louis Wasserman
50
Tun Sie sich und Ihren Teamkollegen einen Gefallen und mischen Sie die Zustandsmutation nicht in dieselbe Zeile wie die Zustandsprüfung. Dies verringert die Lesbarkeit Ihres Codes drastisch. (Es gibt einige Fälle, in denen dies aufgrund von Atomizitätsanforderungen unbedingt erforderlich ist, aber Funktionen für diese bereits vorhanden sind und deren Zweck sofort erkannt wird.)
jpmc26
50
Die eigentliche Frage ist, warum Sie solchen Code schreiben möchten.
Klutt
26
Der Schlüssel zu Ihrer Frage ist Ihre falsche Überzeugung, dass Klammern eine Bewertungsreihenfolge implizieren. Das ist eine verbreitete Überzeugung, weil wir in der Grundschule Mathematik unterrichtet haben und weil einige Anfänger-Programmierbücher es immer noch falsch verstehen , aber es ist eine falsche Überzeugung. Dies ist eine ziemlich häufige Frage. Sie könnten davon profitieren, meine Artikel zu diesem Thema zu lesen. Es geht um C #, aber sie gelten für Java: ericlippert.com/2008/05/23/precedence-vs-associativity-vs-order ericlippert.com/2009/08/10/precedence-vs-order-redux
Eric Lippert

Antworten:

97

die in der durch Klammern angegebenen Reihenfolge zuerst berechnet werden sollte

Nein. Es ist ein weit verbreitetes Missverständnis, dass Klammern (allgemeine) Auswirkungen auf die Berechnungs- oder Bewertungsreihenfolge haben. Sie zwingen nur die Teile Ihres Ausdrucks zu einem bestimmten Baum und binden die richtigen Operanden an die richtigen Operationen für den Job.

(Und wenn Sie sie nicht verwenden, stammen diese Informationen aus der "Priorität" und Assoziativität der Operatoren. Dies ist ein Ergebnis der Definition des Syntaxbaums der Sprache. Tatsächlich funktioniert dies immer noch genau so, wenn Sie es tun Verwenden Sie Klammern, aber wir vereinfachen und sagen, dass wir uns dann nicht auf Vorrangregeln verlassen.)

Sobald dies erledigt ist (dh wenn Ihr Code in ein Programm analysiert wurde), müssen diese Operanden noch ausgewertet werden, und es gibt separate Regeln, wie dies gemacht wird: Diese Regeln (wie Andrew uns gezeigt hat) geben an, dass die LHS jeder Operation wird zuerst in Java ausgewertet.

Beachten Sie, dass dies nicht in allen Sprachen der Fall ist. In C ++ ist die Auswertungsreihenfolge von Operanden im Allgemeinen nicht angegeben , es sei denn, Sie verwenden einen Kurzschlussoperator wie &&oder ||, und Sie sollten sich in keiner Weise darauf verlassen.

Die Lehrer müssen aufhören, die Priorität von Operatoren mit irreführenden Sätzen wie "Dies macht die Hinzufügung zuerst" zu erklären. Bei einem gegebenen Ausdruck wäre x * y + zdie richtige Erklärung "Vorrang des Operators macht die Addition zwischen x * yund zstatt zwischen yund z", ohne dass eine "Reihenfolge" erwähnt wird.

Leichtigkeitsrennen im Orbit
quelle
6
Ich wünschte, meine Lehrer hätten eine gewisse Trennung zwischen der zugrunde liegenden Mathematik und der Syntax, die sie zur Darstellung verwendeten, vorgenommen, als ob wir einen Tag mit römischen Ziffern oder polnischer Notation oder was auch immer verbracht hätten und gesehen hätten, dass dieser Zusatz die gleichen Eigenschaften hat. Wir haben in der Mittelschule Assoziativität und all diese Eigenschaften gelernt, also gab es viel Zeit.
John P
1
Ich bin froh, dass Sie erwähnt haben, dass diese Regel nicht für alle Sprachen gilt. Wenn eine Seite einen anderen Nebeneffekt hat, z. B. das Schreiben in eine Datei oder das Lesen der aktuellen Uhrzeit, ist (auch in Java) nicht definiert, in welcher Reihenfolge dies geschieht. Das Ergebnis des Vergleichs ist jedoch so, als ob es von links nach rechts ausgewertet wurde (in Java). Abgesehen davon: Einige Sprachen verbieten das Mischen und Vergleichen auf diese Weise einfach durch Syntaxregeln, und das Problem würde nicht auftreten.
Abel
5
@ JohnP: Es wird schlimmer. Bedeutet 5 * 4 5 + 5 + 5 + 5 oder 4 + 4 + 4 + 4 + 4? Einige Lehrer bestehen darauf, dass nur eine dieser Entscheidungen richtig ist.
Brian
3
@Brian Aber ... aber ... die Multiplikation reeller Zahlen ist kommutativ!
Leichtigkeitsrennen im Orbit
2
In meiner Denkwelt steht ein Paar Klammern für "wird benötigt für". Bei der Berechnung von ´a * (b + c) ´ würden die Klammern ausdrücken, dass das Ergebnis der Addition für die Multiplikation benötigt wird . Alle impliziten Bedienerpräferenzen können durch Parens ausgedrückt werden, mit Ausnahme der LHS-First- oder RHS-First-Regeln. (Ist das wahr?) @Brian In der Mathematik gibt es einige seltene Fälle, in denen die Multiplikation durch wiederholte Addition ersetzt werden kann, aber das ist bei weitem nicht immer wahr (beginnend mit komplexen Zahlen, aber nicht beschränkt auf). Also sollten Ihre Erzieher wirklich ein Auge darauf haben, was die Leute erzählen ...
Syck
164

==ist ein binärer Gleichheitsoperator .

Der linke Operand eines binären Operators scheint vollständig ausgewertet zu sein, bevor ein Teil des rechten Operanden ausgewertet wird.

Java 11-Spezifikation> Auswertungsreihenfolge> Linken Operanden zuerst auswerten

Andrew Tobilko
quelle
42
Der Wortlaut "scheint zu sein" klingt nicht so, als wären sie sich sicher, tbh.
Herr Lister
86
"scheint zu sein" bedeutet, dass die Spezifikation nicht erfordert, dass die Operationen tatsächlich in dieser Reihenfolge chronologisch ausgeführt werden, sondern dass Sie das gleiche Ergebnis erhalten, das Sie erhalten würden, wenn sie es wären.
Robyn
24
@MrLister "scheint zu sein" scheint eine schlechte Wortwahl für sie zu sein. Mit "erscheinen" meinen sie "sich als Phänomen für den Entwickler manifestieren". "ist effektiv" kann eine bessere Phrase sein.
Kelvin
18
In der C ++ - Community entspricht dies der "Als-ob" -Regel ... Der Operand muss sich so verhalten, als ob er gemäß den folgenden Regeln implementiert wurde, auch wenn dies technisch nicht der Fall ist.
Michael Edenfield
2
@ Kelvin Ich stimme zu, ich hätte dieses Wort auch gewählt, anstatt "scheint zu sein".
MC Emperor
149

Wie LouisWasserman sagte, wird der Ausdruck von links nach rechts ausgewertet. Und Java ist es egal, was "evaluieren" tatsächlich tut, es ist nur wichtig, einen (nichtflüchtigen, endgültigen) Wert zu generieren, mit dem gearbeitet werden kann.

//the example values
x = 1;
y = 3;

Um die erste Ausgabe von zu berechnen System.out.println(), wird Folgendes ausgeführt:

x == (x = y)
1 == (x = y)
1 == (x = 3) //assign 3 to x, returns 3
1 == 3
false

und um die zweite zu berechnen:

(x = y) == x
(x = 3) == x //assign 3 to x, returns 3
3 == x
3 == 3
true

Beachten Sie, dass der zweite Wert unabhängig von den Anfangswerten von xund immer als wahr ausgewertet wird y, da Sie die Zuordnung eines Werts zu der Variablen, der er zugewiesen ist, effektiv vergleichen a = bund bin dieser Reihenfolge immer gleich sind per Definition.

Poohl
quelle
"Von links nach rechts" gilt übrigens auch in der Mathematik. Wenn Sie zu Klammern oder Vorrang kommen, iterieren Sie in diesen und bewerten alles von links nach rechts, bevor Sie mit der Hauptebene fortfahren. Aber Mathe würde das niemals tun. Die Unterscheidung ist nur wichtig, weil dies keine Gleichung, sondern eine Kombinationsoperation ist, die sowohl eine Zuweisung als auch eine Gleichung auf einen Schlag ausführt . Ich würde dies niemals tun, weil die Lesbarkeit schlecht ist, es sei denn, ich habe Code-Golf gespielt oder nach einer Möglichkeit gesucht, die Leistung zu optimieren, und dann würde es Kommentare geben.
Harper - Monica
25

Ich bin nicht sicher, ob die Java-Sprachspezifikation ein Element enthält, das das Laden des vorherigen Werts einer Variablen vorschreibt ...

Es gibt. Wenn Sie das nächste Mal unklar sind, was in der Spezifikation steht, lesen Sie bitte die Spezifikation und stellen Sie dann die Frage, ob sie unklar ist.

... die rechte Seite, (x = y)die in der durch Klammern angegebenen Reihenfolge zuerst berechnet werden sollte.

Diese Aussage ist falsch. Klammern implizieren keine Reihenfolge der Bewertung . In Java ist die Reihenfolge der Auswertung unabhängig von Klammern von links nach rechts. Klammern bestimmen, wo sich die Unterausdrucksgrenzen befinden, nicht die Reihenfolge der Auswertung.

Warum wird der erste Ausdruck als falsch, der zweite als wahr bewertet?

Die Regel für den ==Operator lautet: Bewerten Sie die linke Seite, um einen Wert zu erzeugen, bewerten Sie die rechte Seite, um einen Wert zu erzeugen, vergleichen Sie die Werte, der Vergleich ist der Wert des Ausdrucks.

Mit anderen Worten, die Bedeutung von expr1 == expr2ist immer dieselbe, als ob Sie geschrieben temp1 = expr1; temp2 = expr2;und dann ausgewertet hätten temp1 == temp2.

Die Regel für den =Operator mit einer lokalen Variablen auf der linken Seite lautet: Auswerten der linken Seite, um eine Variable zu erzeugen, Auswerten der rechten Seite, um einen Wert zu erzeugen, Ausführen der Zuweisung, Ergebnis ist der zugewiesene Wert.

Also setze es zusammen:

x == (x = y)

Wir haben einen Vergleichsoperator. Bewerten Sie die linke Seite, um einen Wert zu erhalten - wir erhalten den aktuellen Wert von x. Bewerten Sie die rechte Seite: Dies ist eine Zuweisung, also bewerten wir die linke Seite, um eine Variable zu erzeugen - die Variable x- wir bewerten die rechte Seite - den aktuellen Wert von y- weisen Sie sie zu x, und das Ergebnis ist der zugewiesene Wert. Wir vergleichen dann den ursprünglichen Wert von xmit dem zugewiesenen Wert.

Sie können (x = y) == xals Übung tun . Denken Sie auch hier daran, dass alle Regeln für die Bewertung der linken Seite vor allen Regeln für die Bewertung der rechten Seite gelten .

Ich hätte erwartet, dass (x = y) zuerst ausgewertet wird, und dann würde es x mit sich selbst vergleichen (3) und true zurückgeben.

Ihre Erwartung basiert auf einer Reihe falscher Überzeugungen über die Regeln von Java. Hoffentlich haben Sie jetzt die richtigen Überzeugungen und werden in Zukunft wahre Dinge erwarten.

Diese Frage unterscheidet sich von "Reihenfolge der Auswertung von Unterausdrücken in einem Java-Ausdruck".

Diese Aussage ist falsch. Diese Frage ist völlig deutsch.

x ist hier definitiv kein "Unterausdruck".

Diese Aussage ist auch falsch. Es ist in jedem Beispiel zweimal ein Unterausdruck .

Es muss für den Vergleich geladen werden, anstatt "ausgewertet" zu werden.

Ich habe keine Ahnung, was das bedeutet.

Anscheinend haben Sie immer noch viele falsche Überzeugungen. Mein Rat ist, dass Sie die Spezifikation lesen, bis Ihre falschen Überzeugungen durch wahre Überzeugungen ersetzt werden.

Die Frage ist Java-spezifisch und der Ausdruck x == (x = y) stammt im Gegensatz zu weit hergeholten unpraktischen Konstrukten, die üblicherweise für knifflige Interviewfragen erstellt wurden, aus einem echten Projekt.

Die Herkunft des Ausdrucks ist für die Frage nicht relevant. Die Regeln für solche Ausdrücke sind in der Spezifikation klar beschrieben; Lies es!

Es sollte ein einzeiliger Ersatz für die Vergleichs- und Ersetzungssprache sein

Da dieser einzeilige Ersatz bei Ihnen, dem Leser des Codes, große Verwirrung stiftete, würde ich vorschlagen, dass dies eine schlechte Wahl war. Es ist kein Gewinn, den Code präziser, aber schwerer zu verstehen. Es ist unwahrscheinlich, dass der Code schneller wird.

Im Übrigen verfügt C # über eine Vergleichs- und Ersetzungsmethode als Bibliotheksmethode, die auf eine Maschinenanweisung reduziert werden kann . Ich glaube, Java hat keine solche Methode, da sie im Java-Typsystem nicht dargestellt werden kann.

Eric Lippert
quelle
8
Wenn jemand das gesamte JLS durchgehen könnte, gäbe es keinen Grund, Java-Bücher zu veröffentlichen, und mindestens die Hälfte dieser Website wäre ebenfalls nutzlos.
John McClane
8
@ JohnMcClane: Ich versichere Ihnen, es gibt keinerlei Schwierigkeiten, die gesamte Spezifikation durchzugehen, aber Sie müssen es auch nicht. Die Java-Spezifikation beginnt mit einem hilfreichen "Inhaltsverzeichnis", mit dem Sie schnell zu den Teilen gelangen, an denen Sie am meisten interessiert sind. Sie ist auch online und kann nach Schlüsselwörtern durchsucht werden. Sie haben jedoch Recht: Es gibt viele gute Ressourcen, mit denen Sie lernen können, wie Java funktioniert. Mein Rat an Sie ist, dass Sie sie nutzen!
Eric Lippert
8
Diese Antwort ist unnötig herablassend und unhöflich. Denken Sie daran: seien Sie nett .
Wal
7
@LuisG.: Keine Herablassung ist beabsichtigt oder impliziert; Wir sind alle hier, um voneinander zu lernen, und ich empfehle nichts, was ich als Anfänger nicht selbst getan habe. Es ist auch nicht unhöflich. Die eindeutige und eindeutige Identifizierung ihrer falschen Überzeugungen ist eine Freundlichkeit gegenüber dem Originalplakat . Sich hinter "Höflichkeit" zu verstecken und den Menschen zu erlauben, weiterhin falsche Überzeugungen zu haben, ist nicht hilfreich und verstärkt schlechte Denkgewohnheiten .
Eric Lippert
5
@LuisG.: Ich habe früher einen Blog über das Design von JavaScript geschrieben, und die hilfreichsten Kommentare, die ich je erhalten habe, waren von Brendan, der klar und eindeutig darauf hinwies, wo ich etwas falsch gemacht habe. Das war großartig und ich schätzte es, dass er sich die Zeit genommen hatte, weil ich dann die nächsten 20 Jahre meines Lebens lebte, ohne diesen Fehler in meiner eigenen Arbeit zu wiederholen oder schlimmer noch, ihn anderen beizubringen. Es gab mir auch die Möglichkeit, dieselben falschen Überzeugungen in anderen zu korrigieren, indem ich mich selbst als Beispiel dafür verwendete, wie Menschen dazu kommen, falsche Dinge zu glauben.
Eric Lippert
16

Dies hängt mit der Priorität der Operatoren und der Bewertung der Operatoren zusammen.

Klammern '()' haben eine höhere Priorität und Assoziativität von links nach rechts. Gleichheit '==' kommt in dieser Frage als nächstes und hat Assoziativität von links nach rechts. Zuweisung '=' kommt zuletzt und hat Assoziativität von rechts nach links.

System verwendet Stack, um den Ausdruck auszuwerten. Der Ausdruck wird von links nach rechts ausgewertet.

Nun kommt die ursprüngliche Frage:

int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false

Zuerst wird x (1) zum Stapeln gedrückt. dann wird inner (x = y) ausgewertet und zum Stapeln mit dem Wert x (3) verschoben. Jetzt wird x (1) mit x (3) verglichen, sodass das Ergebnis falsch ist.

x = 1; // reset
System.out.println((x = y) == x); // true

Hier wird (x = y) ausgewertet, jetzt wird der x-Wert 3 und x (3) wird zum Stapeln verschoben. Jetzt wird x (3) mit geändertem Wert nach Gleichheit zum Stapeln verschoben. Jetzt wird der Ausdruck ausgewertet und beide sind gleich, sodass das Ergebnis wahr ist.

Amit
quelle
12

Es ist nicht das Gleiche. Die linke Seite wird immer vor der rechten Seite ausgewertet, und die Klammern geben keine Ausführungsreihenfolge an, sondern eine Gruppierung von Befehlen.

Mit:

      x == (x = y)

Sie machen im Grunde das Gleiche wie:

      x == y

Und x hat nach dem Vergleich den Wert y .

Während mit:

      (x = y) == x

Sie machen im Grunde das Gleiche wie:

      x == x

Nachdem x den Wert von y angenommen hat. Und es wird immer wahr zurückkehren .

Or10n
quelle
9

Im ersten Test, den Sie überprüfen, wird 1 == 3 ausgeführt.

Im zweiten Test führt Ihre Überprüfung 3 == 3 aus.

(x = y) weist den Wert zu und dieser Wert wird getestet. Im ersteren Beispiel wird zuerst x = 1, dann wird x 3 zugewiesen. Ist 1 == 3?

In letzterem wird x 3 zugewiesen, und offensichtlich ist es immer noch 3. Ist 3 == 3?

Michael Puckett II
quelle
8

Betrachten Sie dieses andere, vielleicht einfachere Beispiel:

int x = 1;
System.out.println(x == ++x); // false
x = 1; // reset
System.out.println(++x == x); // true

Hier muss der Vorinkrement-Operator in ++xangewendet werden, bevor der Vergleich durchgeführt wird - genau wie (x = y)in Ihrem Beispiel muss er vor dem Vergleich berechnet werden .

Die Auswertung der Ausdrücke erfolgt jedoch weiterhin von links → nach → rechts , sodass der erste Vergleich tatsächlich 1 == 2während des zweiten erfolgt 2 == 2.
Das gleiche passiert in Ihrem Beispiel.

walen
quelle
8

Ausdrücke werden von links nach rechts ausgewertet. In diesem Fall:

int x = 1;
int y = 3;

x == (x = y)) // false
x ==    t

- left x = 1
- let t = (x = y) => x = 3
- x == (x = y)
  x == t
  1 == 3 //false

(x = y) == x); // true
   t    == x

- left (x = y) => x = 3
           t    =      3 
-  (x = y) == x
-     t    == x
-     3    == 3 //true
Derviş Kayımbaşıoğlu
quelle
5

Grundsätzlich hatte die erste Anweisung x den Wert 1. Java vergleicht also 1 == mit einer neuen x-Variablen, die nicht dieselbe sein wird

Im zweiten haben Sie x = y gesagt, was bedeutet, dass sich der Wert von x geändert hat. Wenn Sie ihn erneut aufrufen, ist er der gleiche Wert, weshalb er wahr ist und x == x

Ahmad Bedirxan
quelle
4

== ist ein Vergleichsgleichheitsoperator und funktioniert von links nach rechts.

x == (x = y);

hier wird der alte zugewiesene Wert von x mit dem neuen zugewiesenen Wert von x verglichen, (1 == 3) // false

(x = y) == x;

Während hier der neue Zuweisungswert von x mit dem neuen Haltewert von x verglichen wird, der ihm unmittelbar vor dem Vergleich zugewiesen wurde, (3 == 3) // true

Betrachten Sie dies nun

    System.out.println((8 + (5 * 6)) * 9);
    System.out.println(8 + (5 * 6) * 9);
    System.out.println((8 + 5) * 6 * 9);
    System.out.println((8 + (5) * 6) * 9);
    System.out.println(8 + 5 * 6 * 9);

Ausgabe:

342

278

702

342

278

Daher spielen Klammern ihre Hauptrolle in arithmetischen Ausdrücken, nur nicht in Vergleichsausdrücken.

Nisrin Dhoondia
quelle
1
Die Schlussfolgerung ist falsch. Das Verhalten unterscheidet sich nicht zwischen Arithmetik- und Vergleichsoperatoren. x + (x = y)und (x = y) + xwürde ein ähnliches Verhalten wie das Original mit Vergleichsoperatoren zeigen.
JJJ
1
@JJJ In x + (x = y) und (x = y) + x gibt es keinen Vergleich, es wird lediglich x der y-Wert zugewiesen und x hinzugefügt.
Nisrin Dhoondia
1
... ja, das ist der Punkt. "Klammern spielen ihre Hauptrolle in arithmetischen Ausdrücken, nur nicht in Vergleichsausdrücken" ist falsch, weil es keinen Unterschied zwischen arithmetischen und Vergleichsausdrücken gibt.
JJJ
2

Die Sache hier ist die Rangfolge der arithmatischen Operatoren / relationalen Operatoren aus den beiden Operatoren =gegenüber ==der dominanten ==(relationale Operatoren dominieren), da sie den =Zuweisungsoperatoren vorausgeht . Trotz der Rangfolge ist die Reihenfolge der Bewertung LTR (LINKS NACH RECHTS). Die Priorität wird nach der Bewertungsreihenfolge angezeigt. Unabhängig von Einschränkungen ist die Bewertung also LTR.

Himanshu Ahuja
quelle
1
Die Antwort ist falsch. Die Priorität des Bedieners hat keinen Einfluss auf die Bewertungsreihenfolge. Lesen Sie einige der am besten bewerteten Antworten zur Erklärung, insbesondere diese .
JJJ
1
Richtig, es ist tatsächlich die Art und Weise, wie uns beigebracht wird, dass die Illusion von Vorrangbeschränkungen in all diesen Dingen auftritt, aber richtig darauf hingewiesen, dass es keine Auswirkungen hat, da die Reihenfolge der Bewertung von links nach rechts bleibt
Himanshu Ahuja
-1

Im zweiten Vergleich auf der linken Seite ist es einfach, die Zuordnung nach der Zuweisung von y zu x (links) vorzunehmen und dann 3 == 3 zu vergleichen. Im ersten Beispiel vergleichen Sie x = 1 mit der neuen Zuweisung von x = 3. Es scheint, dass Es werden immer Anweisungen zum Lesen des aktuellen Status von links nach rechts von x verwendet.

Michał Ziobro
quelle
-2

Die Art der Frage, die Sie gestellt haben, ist eine sehr gute Frage, wenn Sie einen Java-Compiler schreiben oder Programme testen möchten, um zu überprüfen, ob ein Java-Compiler ordnungsgemäß funktioniert. In Java müssen diese beiden Ausdrücke die Ergebnisse liefern, die Sie gesehen haben. In C ++ zum Beispiel müssen sie das nicht. Wenn also jemand Teile eines C ++ - Compilers in seinem Java-Compiler wiederverwendet, stellen Sie möglicherweise theoretisch fest, dass sich der Compiler nicht so verhält, wie er sollte.

Als Softwareentwickler, der Code schreibt, der lesbar, verständlich und wartbar ist, werden beide Versionen Ihres Codes als schrecklich angesehen. Um zu verstehen, was der Code tut, muss man genau wissen , wie die Java-Sprache definiert ist. Jemand, der sowohl Java- als auch C ++ - Code schreibt, würde beim Betrachten des Codes schaudern. Wenn Sie sich fragen müssen, warum eine einzelne Codezeile das tut, was sie tut, sollten Sie diesen Code vermeiden. (Ich nehme an und hoffe, dass die Leute, die Ihre "Warum" -Frage richtig beantwortet haben, selbst diese Ind des Codes ebenfalls vermeiden werden).

gnasher729
quelle
"Um zu verstehen, was der Code tut, muss man genau wissen, wie die Java-Sprache definiert ist." Aber was ist, wenn jeder Mitarbeiter es für einen gesunden Menschenverstand hält?
BinaryTreeee