2010-12-04 8 views
5

Gibt es eine garantierte Reihenfolge der Ausführung des folgenden Java-Code:Sequenzpunkte in Java

int i = getA() + getB(); 

Ist getA() immer vor getB() ausgeführt, wie jede durchschnittliche Person erwarten würde?

+0

Hinweis: Java garantiert, dass die Methode in der richtigen Reihenfolge aufgerufen wird. Die CPU kann die Lasten jedoch neu ordnen, wenn dies keine Auswirkungen auf das Ergebnis hat. Wenn sich beispielsweise B im Cache befindet, A aber nicht, wartet es nicht auf den Abschluss von A, bevor mit dem Laden von B begonnen wird. Es wird jedoch sichergestellt, dass es keine Auswirkungen auf das Ergebnis hat. –

+0

Jetzt ist das interessant. Die beiden Funktionen haben keine klassischen Nebeneffekte. Es ist nur so, dass 'getA()' eine Weile dauern kann, um auszuführen, während 'getB()' fast ein No-Op ist. Ich möchte sicherstellen, dass der zweite zurückkehrt, sobald der erste zurückkehrt, also ist die Reihenfolge wichtig. Ich könnte es natürlich umschreiben. – milan

Antwort

13

Ja, ist es. Von der JLS, Abschnitt 15.7:

Die Java-Programmiersprache garantiert, dass die Operanden von Operatoren scheinen in einer bestimmten Bewertungsreihenfolge ausgewertet werden, nämlich von links nach rechts.

Es wird empfohlen, dass der Code nicht unbedingt von dieser Spezifikation abhängt. Code ist normalerweise klarer, wenn jeder Ausdruck höchstens eine Nebenwirkung enthält, wie seine äußerste Operation, und wenn der Code nicht genau davon abhängt, welche Ausnahme als Folge der Links-zu-Rechts-Auswertung von Ausdrücken auftritt.

...

Der linke Operand eines Binäroperators erscheint vor Operand ein Teil des rechten vollständig ausgewertet werden ausgewertet.

und auch:

Die Programmiersprache Java garantiert auch, dass jeder Operand eines Operators (mit Ausnahme der bedingten Operatoren & &, || und :) erscheint vollständig, bevor irgendein Teil zu bewerten? der Vorgang selbst durchgeführt wird.

+0

lesen Sie die Antwort macht mich daran erinnern, dass ich schon wusste, dass :) – milan