Существует ли гарантированная последовательность выполнения следующего Java-кода:
int i = getA() + getB();
Всегда ли getA() всегда выполняется до getB(), как и ожидал бы любой средний человек?
getA()
getB()
Да, это так. Из JLS, раздел 15.7:
Язык программирования Java гарантирует, что операнды операторов отображаются в определенном порядке вычисления, а именно слева направо. Рекомендуется, чтобы код не зависел от этой спецификации. Код обычно более понятен, когда каждое выражение содержит не более одного побочного эффекта в качестве самой внешней операции, и когда код не зависит от того, какое именно исключение возникает в результате вычисления выражений слева направо. ... Похоже, что левый операнд бинарного оператора полностью вычисляется перед тем, как вычисляется любая часть правого операнда.
Язык программирования Java гарантирует, что операнды операторов отображаются в определенном порядке вычисления, а именно слева направо.
Рекомендуется, чтобы код не зависел от этой спецификации. Код обычно более понятен, когда каждое выражение содержит не более одного побочного эффекта в качестве самой внешней операции, и когда код не зависит от того, какое именно исключение возникает в результате вычисления выражений слева направо.
...
Похоже, что левый операнд бинарного оператора полностью вычисляется перед тем, как вычисляется любая часть правого операнда.
, а также:
Язык программирования Java также гарантирует, что каждый операнд оператора (кроме условных операторов &&, || и? :), по-видимому, будет полностью вычислен до выполнения какой-либо части самой операции.