Fehler beim Verständnis der Ausführungsreihenfolge in einem Java-Algorithmus (k = und ++ k) [duplizieren]

8

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?

    
Joey van Gangelen 28.11.2016, 10:40
quelle

4 Antworten

1

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

ergibt

Bearbeiten

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.

%Vor%

Beide haben dieselbe Rangordnung, also wird die Auswertung von links nach rechts und a + b zuerst ausgewertet (lasst uns das Ergebnis d nennen).

%Vor%

* hat Vorrang vor + , so dass c * d zuerst ausgewertet wird.

    
David 28.11.2016, 11:33
quelle
3

Die Operatoren post und pre arbeiten mit einem temporären Wert, der nach der Gleichung zugewiesen wird. Was bedeutet, dass

%Vor%

Weil die rechte Seite temporär ist und nicht die linke Seite vor der Zuweisung reflektiert.

Mit Ihrer Logik würde dies zu

führen %Vor%     
Murat K. 28.11.2016 10:50
quelle
2

Ohne Argumente bedeutet args.length = 0

intk = m1 (args.length); m1 (0) = ++ 0 = 1

Also k = 1

k + = 3 + ++ k;

k = k + 3 = 4. ++ k = ++ 1 = 2

Also

4 + 2 = 6

    
M.Sarmini 28.11.2016 10:46
quelle
2

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

%Vor%

Lassen Sie weitergehen mit:

%Vor%

Wir sehen, dass die *= zuletzt mit dem Anfangswert gemacht wurde.

%Vor%

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

    
AxelH 28.11.2016 11:27
quelle

Tags und Links