Ich musste kürzlich eine Java-Prüfung machen und wunderte mich über eine der Fragen, die ich falsch gestellt hatte. Die Frage war wie folgt:
Was wird der folgende Code drucken, wenn er ohne Argumente ausgeführt wird ...
%Vor%Bei den Antworten handelt es sich um eine Zahl zwischen 1 und 10. Meine ursprüngliche Antwort war 7, während sie angeben, dass die richtige 6 ist.
Meine Logik:
%Vor%Sie geben es jedoch als k = 1 + 3 + 2 an. Könnte jemand erklären, warum die Variable zuerst ersetzt wird, bevor das ++ k ausgeführt wird?
Ok, Sie sagen richtig, dass der ++ Operator Vorrang vor dem + = Operator hat und deshalb wird das + = nicht ausgerollt, bis der ++ - Vorgang ausgeführt wurde .... aber bevor irgendeine Operation ausgeführt wird Der Interpreter wertet zunächst die Operanden der meisten Operatoren aus, und zwar von links nach rechts.
Also in Ihrem Beispiel, wo k = 1,
%Vor%ist effektiv:
%Vor%und dann wird ++ k ausgewertet, da dies Vorrang hat und zu:
wird %Vor%das + hat Vorrang und wird:
%Vor%und an diesem Punkt wird das + = abgerollt, was natürlich 6 ... QED
ergibtBearbeiten
Obwohl die Vorrangstellung des Operators wichtig ist, wird von links nach rechts evaluiert, es sei denn der Vorrang gibt etwas anderes vor:
Zum Beispiel:
a + b + c * d
Obwohl c * d
Vorrang hat, wird es nicht zuerst ausgewertet.
Beide haben dieselbe Rangordnung, also wird die Auswertung von links nach rechts und a + b
zuerst ausgewertet (lasst uns das Ergebnis d
nennen).
*
hat Vorrang vor +
, so dass c * d
zuerst ausgewertet wird.
Ich glaube, selbst wenn die Reihenfolge korrekt ist, bereitet die JVM die Anweisung mit dem k
-Wert vor, so dass dies wie folgt aussieht (vereinfacht):
Lassen Sie weitergehen mit:
%Vor% Wir sehen, dass die *=
zuletzt mit dem Anfangswert gemacht wurde.
So können wir sehen, dass dies nicht für Post-Inkrement gilt. Diese erhalten den Wert von k
beim ersten Lesen
Die einzige Logik, die ich sehe, ist, dass die Werte von links nach rechts ausgewertet werden, aber der Operator nur in Abhängigkeit von der Reihenfolge ausgeführt wird. Bei der Ausnahme von Post- und Pre-Inkrement, die beim ersten Lesen ausgewertet werden