Является ли порядок операций слева направо гарантированным на Java?

Рассмотрим эту функцию:

public static final int F(int a, int b) {
    a = a - 1 + b;
    // and some stuff
    return a;
}

Требуется ли реализация JVM для выполнения - 1 до + b?

Если у нас есть профилировщик системы, подключенный к JVM, мы увидим операцию + b, выполняемую до операции + 1?

Ответ 1

Собственно, я не соглашусь с остальными ответами. JLS §15.7, о котором люди ссылаются, обсуждает оценку операндов. То есть в выражении

x = foo() - 1 + bar()

в каком порядке будут вызываться методы.

Соответствующий раздел - это §15.7.3, в котором указывается

Реализация не может использовать алгебраические тождества, такие как ассоциативный закон, для переписывания выражений в более удобный вычислительный порядок , если нельзя доказать, что замещающее выражение эквивалентно по значению и наблюдаемым побочным эффектам [...]

Так как выражение x = x - 1 + q эквивалентно во всех отношениях x = x + q - 1, соответствующей реализации разрешено переписать выражение (если по какой-то причине он должен решить, что это более эффективно).

Ответ 2

Да, это на языке Java спецификация, §15.7.

Язык программирования Java гарантирует, что операнды операторов будут оцениваться в определенном порядке оценки, а именно слева направо.

Рекомендуется, чтобы код не опирался на эту спецификацию. Код обычно более ясен, когда каждое выражение содержит не более одного побочного эффекта, как его самую удаленную операцию, и когда код не зависит от того, какое именно исключение возникает в результате оценки выражений слева направо.

Ответ 3

В соответствии с здесь:

Операторы в одной строке имеют одинаковый приоритет. Когда операторы равное предпочтение появляется в том же выражении, правило должно регулировать который оценивается первым. Все бинарные операторы, кроме операторы присваивания оцениваются слева направо; назначение операторы оцениваются справа налево.

Итак, да.

Ответ 4

Да, хотя вопрос большой, действительно ли это имеет значение? Вычитание и добавление имеют одинаковый приоритет в любой научной математической операции и являются коммутируемыми. То есть:

x = input - 1 + q;

совпадает с

x = ввод + q - 1;

Ответ 6

Здесь вы можете увидеть приоритет оператора в Java: http://bmanolov.free.fr/javaoperators.php. Поскольку + и - имеют одинаковый приоритет, они будут выполняться в том порядке, в котором они отображаются.

Если вы хотите более четко узнать, что происходит в первую очередь (или если вы хотите разбить встроенный приоритет), вы можете (и должны) использовать скобки (( и )), например это:

x = (a - b) + (c * (d - e))

Ответ 7

Да, это всегда будет, хотя это никак не повлияет на результат добавления/вычитания.

Ответ 8

На самом деле это не будет реализация JVM, поскольку они просто выполняют список инструкций из файла класса.

Ответ 9

Мне кажется, что всегда будет побочный эффект от выполнения X + q - 1 Когда вы должны выполнять X - 1 + q.

Когда сумма x + q превышает Bignum на 1, выполнение слева направо будет выполнено... Выполнение вне порядка вызовет переполнение.

Таким образом, выполнение вне порядка имеет побочный эффект.

Если не задействованы ловушки выполнения вне очереди, которые переполняют себя, тогда при необходимости необходимо выполнить расчет в правильном порядке, чтобы избежать побочного эффекта.

Ответ 10

Важно добавить, что java имеет приоритет в строке для операторов, которые, как представляется, основаны на базовом арифметическом порядке операций. Для списка полного приоритета посмотрите источник